2013-12-20 52 views
2

我試圖解決這個SQL問題,我有一打不同的綵球和幾個盒子。現在,我試圖編寫一個SQL查詢,輸出每個框中球的顏色。所以,如果在方框A,B和C中存在綠球,但藍球和紅球在3個方框中只有1或2個,我應該只輸出綠色。SQL:只輸出每個框中的球的顏色/顏色

我有三個表:

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) 

但後來我意識到,一旦你給一個值,有NULL上boxid它的行我也會輸出這些顏色,因爲我的SQL查詢沒有考慮到綵球必須位於所有三個不同的盒子中,只是所有三個綵球都放在任何盒子裏。

我難以理解如何改變我的查詢,以便它只計數球是否在另一個盒子中。請幫忙。

回答

2

假設我們知道,不同的箱子的數量是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 
+0

我不認爲WHERE colorid IS NOT NULL,我可以使用色彩,因爲這些值是可以改變的 – user3124096

+0

你是什麼意思?查詢代表某個時間點db的狀態,因此它們不能「更改」 – Sklivvz

+0

我的意思是如果有人更新表格Ball以便每個球在boxid中都有一個值,那麼該查詢將不起作用。 – user3124096

0

您可以首先創建一個交叉連接的可能組合和內部連接,按顏色分組。

0

使用內部連接...發現,在所有3盒

SELECT DISTINCT 
    colorID 
FROM 
    Ball 

    INNER JOIN (SELECT boxID, colorID FROM Ball WHERE boxID = 'A') A 
    ON Ball.colorID = A.colorID 

    INNER JOIN (SELECT boxID, colorID FROM Ball WHERE boxID = 'B') B 
    ON Ball.colorID = B.colorID 

    INNER JOIN (SELECT boxID, colorID FROM Ball WHERE boxID = 'C') C 
    ON Ball.colorID = C.colorID 
+0

是否可以修改它,使其即使我插入一個新的ID到表框(意味着我添加另一個框),它將工作?似乎必須爲每個Box添加一個INNER JOIN。 – user3124096