gpt4 book ai didi

sql - 仅当匹配所有列表值时才返回行

转载 作者:行者123 更新时间:2023-12-02 08:19:55 25 4
gpt4 key购买 nike

假设我有一张表customers:

--------------------
|id|name|country|
|1 |Joe |墨西哥 |
|2 |玛丽|美国|
|3 |Jim |France |
----------------

还有一个表languages:

----------------
|id|language|
|1 |英语 |
|2 |西类牙语 |
|3 |法语 |
------------

还有一个表cust_lang:

--------------------
|id|custId|langId|
|1 |1 |1 |
|2 |1 |2 |
|3 |2 |1 |
|4 |3 |3 |
--------------------

给定一个列表:["English", "Spanish", "Portugese"]对列表使用 WHERE IN,它仍会返回 ID 为 1,2 的客户,因为它们匹配“英语”和“西类牙语”。但是,结果应该返回 0 行,因为没有客户匹配所有三个术语。我只希望客户 ID 在与 cust_lang 表匹配时返回。例如,给定一个列表:["English", "Spanish"]我希望结果是客户 ID 1,因为只有他一个人会说两种语言。

编辑:@GordonLinoff - 行得通!!

现在让它变得更复杂,这个额外的相关查询有什么问题:

假设我还有一个表 degrees:

------------
|id|degree|
|1 |PHD |
|2 |BA |
|3 |MD |
------------

对应的连接表cust_deg:

--------------------
|id|custId|degId |
|1 |1 |1 |
|2 |1 |2 |
|3 |2 |1 |
|4 |3 |3 |
--------------------

以下查询无效。但是,它是两个相同查询的组合。结果应该只是匹配两个列表的行,而不是一个列表。

SELECT * FROM customers C
WHERE C.id IN (
SELECT CL.langId FROM cust_lang CL
JOIN languages L on CL.langId = L.id
WHERE L.language IN ("English", "Spanish")
GROUP BY CL.langID
HAVING COUNT(*) = 2)
AND C.id IN (
SELECT CD.custId FROM cust_deg CD
JOIN degrees D ON CD.degID = D.id
WHERE D.degree IN ("PHD", "BA")
GROUP BY CD.custId HAVING COUNT(*) = 2));`

EDIT2:我想我已经修好了。我不小心在那里有一个额外的选择语句。

最佳答案

您可以使用 group byhaving 来做到这一点:

select cl.custid
from cust_lang cl join
languages l
on cl.langid = l.id
where l.language in ('English', 'Spanish', 'Portuguese')
group by cl.custid
having count(*) = 3;

例如,如果您只想检查两种语言,那么您只需更改WHERE ... INHAVING 条件,例如:

where l.language in ('English', 'Spanish')

having count(*) = 2

关于sql - 仅当匹配所有列表值时才返回行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38135690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com