在连接表语句中访问 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的主要内容,如果未能解决你的问题,请参考以下文章

「MySQL」- 复杂的SQL查询语句

Oracle-18-select语句初步&SQL中用算术表达式&别名的使用&连接运算符%distinct&where子句

sql99 连接查询

sql 优化

数据库的SQL语句中,嵌套查询和连接查询有啥区别,说的详细的

SQL多表链接查询、嵌入SELECT语句的子查询技术