我在MySQL数据库中有一个名为sales
的表,它看起来像这样:
company manufactured shipped
Mercedes Germany United States
Mercedes Germany Germany
Mercedes Germany United States
Toyota Japan Canada
Toyota Japan England
Audi Germany United States
Audi Germany France
Audi Germany Canada
Tesla United States Mexico
Tesla United States Canada
Tesla United States United States
这是一个Fiddle:http://www.sqlfiddle.com/#!17/145ff/3
我想返回在国际上运送ALL其产品的公司列表(即,对于特定company
的ALL记录,manufactured
列中的值与shipped
列中的数值不同)。
使用上面的例子,期望的结果集是:
company
Toyota
Audi
这是我的尝试:
WITH temp_table AS (
SELECT
s.company AS company
, SUM(CASE
WHEN s.manufactured != s.shipped THEN 1
ELSE 0
END
) AS count_international
, COUNT(s.company) AS total_within_company
FROM
sales s
GROUP BY
s.company
)
SELECT
company
FROM
temp_table
WHERE count_international = total_within_company
从本质上讲,我计算列不匹配的实例。然后,我检查这些不匹配实例的总和是否与给定组中的记录数相匹配。
这种方法有效,但它远非一个优雅的解决方案!
有人能为实现这个查询的更惯用的方法提供建议吗?
谢谢!
我们可以GROUP BY
公司,并使用HAVING
子句来表示shipped
中的所有国家/地区必须与manufactured
中的国家/地区不同:
SELECT company
FROM sales
GROUP BY company
HAVING COUNT(CASE WHEN manufactured = shipped THEN 1 END) = 0;
在这里试用:db<gt;小提琴
问题中链接的fiddle是Postgres数据库,但MySQL被称为DBMS。
在MySQL数据库中,上述查询可以简化为:
SELECT company
FROM sales
GROUP BY company
HAVING SUM(manufactured = shipped) = 0;
在Postgres数据库中,这是不可能的。
你必须集中思考。。。你想显示没有匹配项的所有内容--查找匹配项显示其余
SELECT DISTINCT company
FROM sales
WHERE company NOT IN (
SELECT company
FROM sales
WHERE manufactured = shipped
)