【发布时间】:2016-12-05 19:34:43
【问题描述】:
我有一个包含多个连接的 SQL 语句。我想给我们两个表的 IN 语句,如下所示:
SELECT
p.id, p.first_name as [First Name],
p.last_name as [Last Name]
FROM
tbl_person as p ,
tbl_person_languages as pl ,
tbl_person_skills As ccp
WHERE
pl.language_id in (12,14) AND
ccp.skill_id in (55)
GROUP BY
p.id, p.first_name , p.last_name
HAVING
count(pl.language_id) = 2 and count(ccp.skill_id) =1
所以,我想撤回所有不同的记录,其中一个人的 language_ids 等于 12 AND 14 并且 Skill_id = 1。但是,这会返回一个空集。我已经确认数据存在至少一条记录,所以我应该看到一些东西。
我应该注意,会有更多的连接,并且 language_ids 和 Skill_ids 值可以改变。这与我之前提出的问题 (Access SQL using IN where record must satisfy all values) 类似,但这是针对多个连接表的。 谢谢
编辑
我已经更新了 SQL 以使用 Joins,如下所示:
SELECT
p.id,
p.first_name as [First Name],
p.last_name as [Last Name]
FROM
(( tbl_person as p
INNER JOIN tbl_person_languages as pl
ON p.id = pl.person_id)
INNER JOIN tbl_person_crossCuttingSkills As ccp
ON p.id = ccp.person_id)
WHERE
pl.language_id in (12,14) AND
ccp.skill_id in (55)
GROUP BY
p.id,
p.first_name,
p.last_name
HAVING
count(pl.language_id) = 2 AND
count(ccp.skill_id) =1
但这现在会产生语法错误(缺少运算符)。
【问题讨论】:
-
我的猜测是它是空的,因为您的
HAVING子句由于缺少连接而失败。我认为它将计算您表中的所有 pl.language_id ,并且仅在只有两个人知道该语言时才返回 language_ids 。此外,由于没有连接,您会得到重复/错误计数。您需要确保您加入您的餐桌,然后我们才能进一步了解。此外,如果仅出于可读性原因,我建议您使用ON关键字而不是WHERE将ANSI sql 与您的联接一起使用。 stackoverflow.com/questions/1018822/…