gpt4 book ai didi

sql - PostgreSQL 搜索条件必须输出丢失的行

转载 作者:行者123 更新时间:2023-11-29 12:56:01 25 4
gpt4 key购买 nike

我有两个 postgreSQL 表,即:employeesemployee_cars。我需要输出所有拥有“BMW”、“MERC”和“VW”但不是“AUDI”的员工。

我试过以下查询:

SELECT DISTINCT a.employee_name, b.car_brand
FROM employees a
LEFT JOIN employee_cars b
ON a.employee_id = b.employee_id
WHERE b.car_brand IN ('BMW','MERC','VW')
AND b.car_brand NOT LIKE 'AUDI';

输出如下:

employee_name,car_brand
"Mary","BMW"
"Mary","MERC"
"Mary","VW"
"Paul","BMW"
"Paul","MERC"
"Paul","VW"

问题是员工拥有的每辆车都是 employee_cars 表中的一行。例如;我有“Mary”,它拥有:“BMW”、“MERC”、“VW”、“AUDI”。我有 'Paul',它只拥有:'BMW'、'MERC'、'VW'。我的查询将显示 Mary 和 Paul,因为他们都拥有“BMW”、“MERC”、“VW”。

我只想在结果中看到“Paul”,因为他缺少“AUDI”。

请注意,我不是数据库专家,我将不胜感激任何帮助和帮助。提前致谢。

最佳答案

我需要输出所有拥有“BMW”、“MERC”和“VW”但不是“AUDI”的员工。如果您需要区分员工,而不是员工 + 汽车品牌对,您可以通过聚合来做到这一点:

SELECT   e.employee_name, string_agg(c.car_brand, ', ')
FROM employees e
JOIN employee_cars c ON e.employee_id = c.employee_id
GROUP BY e.employee_id
HAVING COUNT(1) FILTER (WHERE c.car_brand IN ('BMW', 'MERC', 'VW')) = 3
AND COUNT(1) FILTER (WHERE c.car_brand = 'AUDI') = 0

这也将过滤掉没有“BMW”、“MERC”“VW”(如您建议的问题)的员工。

http://rextester.com/MQL14836

编辑:对于较旧的 PostgreSQL 版本,使用 CASE 表达式而不是 FILTERing:

SELECT   e.employee_name, string_agg(c.car_brand, ', ')
FROM employees e
JOIN employee_cars c ON e.employee_id = c.employee_id
GROUP BY e.employee_id
HAVING COUNT(CASE WHEN c.car_brand IN ('BMW', 'MERC', 'VW') THEN 1 END) = 3
AND COUNT(CASE WHEN c.car_brand = 'AUDI' THEN 1 END) = 0

http://rextester.com/KHMW56692

关于sql - PostgreSQL 搜索条件必须输出丢失的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43178805/

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