2013-12-20 4 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) 

을하지만 그때 나는 깨달았다 당신은 boxid에 NULL이 행에 값을 제공하면 내 SQL 쿼리는 컬러 볼이 세 개의 다른 상자에 있어야한다는 것을 고려하지 않기 때문에 이러한 색상을 출력 할 것입니다. 세 개의 컬러 볼은 모두 상자에 있습니다.

내 쿼리를 변경하는 방법에 문제가있어 공이 다른 상자와 다른 상자에있는 경우에만 계산됩니다. 도와주세요.

답변

2

우리가 서로 다른 상자의 수는 3 것을 알고 있다고 가정 : 볼이 Box에있는 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 

, 우리는 필요 부차적 인 질문은 우리가 신경 쓰는 상자 안에있는 공 수를 세는 것입니다.

+0

3 개 상자에있는 색상을 찾기 위해, 당신이 무슨 뜻 이죠 값이 – user3124096

+0

변경 될 수 있기 때문에 ? 쿼리는 특정 시점에서 DB의 상태를 나타냅니다. 따라서 "변경"할 수 없습니다. – Sklivvz

+0

누군가가 테이블 공을 업데이트하면 모든 공이 boxid에 값을 가지므로 그 쿼리가 작동하지 않습니다. . – user3124096

0

먼저 색상 조합으로 가능한 조합과 내부 결합의 교차 결합을 만들 수 있습니다.

0

내부 조인 사용 ... 내가 colorid가 null는 아니고, 어디에서 사용할 수있는 생각하지 않는다

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를 삽입해도 작동하도록 수정 가능합니까 (다른 상자 추가)? 각 상자에 대해 INNER JOIN을 추가해야하는 것처럼 보입니다. – user3124096