0

次のテーブル構造があります

table 1     
ID SOURCE_ID    NAME
1   1            A
2   1            B
3   2            B
4   2            C
5   2            A

すべての SOURCE_ID で共通の名前を選択する必要があるため、SOURCE_ID 1,2 の両方に存在するため、名前 A と B が必要です。

次のクエリでは、期待される出力が得られます。

SELECT  DISTINCT NAME  
FROM TABLE1 A, TABLE1 B
WHERE A.NAME = B.NAME AND A.SOURCE_ID != B.SOURCE_ID 

テーブル内のデータが新しいレコード ID 6 を含むように変更されると、


table 1     

ID  SOURCE_ID   NAME
1   1             A
2   1             B
3   2             B
4   2             C
5   2             A
6   3             A

3 つすべての SOURCE_ID(1,2,3) に共通する名前は A です。

新しいレコードが入力されると、クエリが正しい出力を返しません。

新しいレコードが挿入されたときに正しく機能するクエリを教えてください。

4

1 に答える 1

1

次のようなものを見てください

DECLARE @Table TABLE(
        SOURCE_ID INT,
        NAME VARCHAR(20)
)

INSERT INTO @Table SELECT 1,'A'
INSERT INTO @Table SELECT 1,'B'
INSERT INTO @Table SELECT 2,'B'
INSERT INTO @Table SELECT 2,'C'
INSERT INTO @Table SELECT 2,'A'

--INSERT INTO @Table SELECT 3,'A'

;WITH DistinctCount AS (        
        SELECT  NAME,
                COUNT(DISTINCT SOURCE_ID) Cnt
        FROM    @Table
        GROUP BY    NAME
)
SELECT  *
FROM    DistinctCount
WHERE   Cnt = (SELECT COUNT(DISTINCT SOURCE_ID) FROM @Table)

6 番目の挿入をコメントアウトすると、A と B が返され、それが含まれている場合は A が返されます。

于 2012-07-11T06:06:49.887 に答える