2016-12-05 32 views
1

我有一个具有多个连接的SQL语句。我想我们的IN语句两个表,就像这样:在连接的表语句中访问SQL多重HAVING

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和14,并有skill_id也= 1但是,这会返回一个空集。我已经确认数据至少存在一条记录,所以我应该看到一些东西。

我应该注意到,会有更多连接,并且language_ids和skill_ids值可能会改变。这与我询问的前一个问题(Access SQL using IN where record must satisfy all values)类似,但是这是与多个连接的表格。 感谢

编辑

我已经更新为使用SQL连接,因为这样的:

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 

但这现在创建一个语法错误(缺少操作员)。

+1

我的猜测是,由于缺少连接导致'HAVING'子句失败,因此它是空的。我认为它会计算表中的所有pl.language_id,并且只有在知道该语言的两个人时才返回language_ids。此外,由于没有加入,你会得到重复/错误。在我们能够进一步得到之前,你需要确保你加入你的桌子。另外,如果仅出于可读性的原因,我建议使用ANSI sql与您的连接使用'ON'关键字而不是'WHERE'。 http://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause – MoondogsMaDawg

回答

1

属性是字符串类型还是数值类型?在IN运算符(如CInt(language_id)IN(12,14))中使用IN运算符(如IN('12,'14')或class属性)作为CInt()。

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 
+0

这些值是数字,而不是字符串。它们是另一个表中的外键。我不相信ACCESS支持NUMERIC功能 – jason

+0

[chat]尝试使用CInt() – JL82559

1

它失败了,因为您在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 
+0

我已更新我的原始问题以发布新的SQL。它使用内建联接,因为你推荐,但现在我得到一个语法错误(语法错误(缺少运算符)在查询表达式'p.id = pl.person_id INNER JOIN tbl_person_skills as ccp ON p.id = person.id' – jason

+0

是吗?在的GroupBy支架? GROUP BY p.id, p.first_nam], 而我假设你有在技能和语言表中为person_id字段的有效外键? – EllieK

+0

对不起,错字在粘贴。我会修正后。是的,每个表都有一个FK到tbl_person表 – jason