在连接表语句中访问 SQL 多个 HAVING
Posted
技术标签:
【中文标题】在连接表语句中访问 SQL 多个 HAVING【英文标题】:Access SQL mutliple HAVING in joined table statement 【发布时间】: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 与您的联接一起使用。 ***.com/questions/1018822/…
【参考方案1】:
属性是字符串类型还是数值类型?使用带引号的 IN 运算符,如 IN ('12, '14') 或 IN 运算符中 CInt() 的类属性,如 CInt(language_id) IN (12,14)。
SELECT
p.id,
p.first_name as [First Name],
p.last_name as [Last Name]
FROM
tbl_person as p ,
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
【讨论】:
这些值是数字,而不是字符串。它们是另一个表的外键。而且我不相信 ACCESS 支持 NUMERIC 功能 Stack Overflow Chat 尝试使用 CInt()【参考方案2】:它失败是因为您在 HAVING 语句中表达了笛卡尔积(联接)。尝试在查询的 SELECT 部分中包含 pl.language_id ,您应该明白我的意思了。
按照其他人的建议,您需要创建 JOIN 语句。
FROM
tbl_person as p
INNER JOIN tbl_person_languages as pl
ON p.id = pl.person_id_FK
INNER JOIN tbl_person_skills As ccp
ON p.id = ccp.person_id_FK
【讨论】:
我已经更新了我原来的问题以发布新的 SQL。它使用您推荐的内部联接,但现在我在查询表达式'p.id = pl.person_id INNER JOIN tbl_person_skills as ccp ON p.id =person.id'中收到语法错误(语法错误(缺少运算符)) 是GroupBy中的括号吗? GROUP BY p.id, p.first_nam],我假设您在 Skills 和 Languages 表的 person_id 字段中确实有有效的外键? 抱歉,粘贴错误。我会在帖子中修复。是的,每个表都有一个 tbl_person 表的 FK 您的选择中也有 pl.ID 和 ccp.ID 但没有将它们包装在聚合函数中。它们需要被分组或聚合。 呃,我讨厌这个问题。 Access 需要在联接语句周围加上括号。请参阅this 问题。试试看:FROM (tbl_person as p INNER JOIN tbl_person_languages as pl ON p.id = pl.person_id_FK) INNER JOIN tbl_person_skills As ccp ON p.id = ccp.person_id_FK
以上是关于在连接表语句中访问 SQL 多个 HAVING的主要内容,如果未能解决你的问题,请参考以下文章
Oracle-18-select语句初步&SQL中用算术表达式&别名的使用&连接运算符%distinct&where子句