我正在尝试解决这个 SQL 问题,我有十几个不同颜色的球和几个盒子。现在,我正在尝试编写一个 SQL 查询来输出每个框中的球的颜色。因此,如果绿球存在于盒子 A、B 和 C 中,但蓝球和红球仅存在于 3 个盒子中的 1 或 2 个中,那么我应该只输出绿色。
我有三个表:
盒子
ID |
====|
A |
B |
C |
球
Number | boxid | colorid |
=======|=======|=========|
1 |A | Green |
2 |A | Red |
3 |A | Blue |
4 |B | Green |
5 |B | Red |
6 |NULL | Blue |
7 |C | Green |
8 |NULL | Red |
9 |NULL | Blue |
10 |NULL | Green |
11 |NULL | Red |
12 |NULL | Blue |
NULL 表示它们不在任何盒子内
颜色
Name |
======|
Blue |
Red |
Green |
现在,起初我认为我可以使用以下代码解决这个问题:
SELECT colorid
FROM Ball
GROUP BY colorid
HAVING COUNT(colorid) = (SELECT COUNT(*) FROM Box)
OR COUNT(colorid) > (SELECT COUNT(*) FROM Box)
但后来我意识到,一旦你给 boxid 上有 NULL 的行赋值,它也会输出这些颜色,因为我的 SQL 查询没有考虑到彩色球必须位于所有三种不同的颜色中盒子,只是所有三个彩色球都在任何盒子里。
我很困惑如何更改我的查询,以便仅当球位于与另一个盒子不同的盒子中时才有效。请帮忙。
最佳答案
假设我们知道不同盒子的数量是 3:
SELECT colorId
FROM Ball
WHERE boxid IS NOT NULL
GROUP BY colorId
HAVING COUNT (DISTINCT boxid) = 3
否则
SELECT colorId
FROM Ball
WHERE boxid IS NOT NULL
GROUP BY colorId
HAVING COUNT (DISTINCT boxid) = SELECT COUNT (DISTINCT ID) FROM Box
如果球可以位于与 Box
中的三个不同的盒子中,那么我们需要一个子查询来仅计算我们关心的盒子中的球。
SELECT colorId
FROM Ball
WHERE EXISTS(SELECT 1 FROM Box WHERE ID = boxid)
GROUP BY colorId
HAVING COUNT (DISTINCT boxid) = SELECT COUNT (DISTINCT ID) FROM Box
关于SQL:仅输出每个框中的球的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20712742/