2013-05-30 14 views
1

我有n個表格全部具有相同的字段:UsernameValue。同一個用戶名可以在每個表上有多個寄存器,但組合Username/Value在每個表上都是唯一的。T-SQL中表格元素之間的邏輯AND

我想將表連接成一個表,其中包含所有具有所有不同(用戶名/值)對的所有表上出現的用戶。

  • 表A:{(User1,Value1);(User1,Value2);(User2,Value2);(User3,Value4)]

  • 表B:{(User1,Value4);(User3,Value5)]

  • 表C:{(User1,Value5);(User1,Value2);(User2,Value7);(User3,Value8)]

希望的輸出

Table D: {(User1,Value1);(User1,Value2);(User1,Value4);(User1,Value5);(User3,Value4);(User3,Value5);(User3,Value8)} 

我現在做多連接(用perl)這樣

SELECT * 
INTO $target_table 
FROM (SELECT * 
     FROM $table1 
     WHERE bname IN (SELECT DISTINCT bname FROM $table2) 
     UNION 
     SELECT * 
     FROM $table2 
     WHERE bname IN (SELECT DISTINCT bname FROM $table1) 
    ) UN 

,然後做第三個表和target_table等之間的相同加盟,但我認爲這應該是一個更好的辦法。

任何提示?

+0

'SELECT * FROM一個UNION SELECT *從B UNION SELECT ... * FROM n;' –

+0

如果我使用UNION,來自USER2的元素也出現在fina上l表 – DrNoone

+0

對不起,我沒有意識到這個要求。 –

回答

1
With Combined As 
    (
    Select 'A' As TableName, Username, Value 
    From TableA 
    Union All 
    Select 'B', Username, Value 
    From TableB 
    Union All 
    Select 'C', Username, Value 
    From TableC 
    ) 
Select C.Username, C.Value 
From Combined As C 
    Join (
      Select C1.Username 
      From Combined As C1 
      Group By C1.Username 
      Having Count(Distinct C1.TableName) = 3 
     ) As Z 
     On Z.Username = C.Username 
Group By C.Username, C.Value 

SQL Fiddle version

2

您可以使用UNION此:

SELECT username, value 
FROM $table1 
UNION 
SELECT username, value 
FROM $table2 
... 
SELECT username, value 
FROM $tablex 

這將返回不同的記錄。如果您對複製品感興趣,請使用UNION ALL


鑑於您的編輯,看起來您只希望返回記錄,如果用戶在所有表中。

打破這一點,你需要做一些事情。首先,再次將所有記錄組合在一起,但是這一次表示每個記錄來自哪個表。然後,您需要知道每個用戶所在的表的數量。最後,您需要根據總表數檢查該數字。

下面是使用一些熱膨脹係數的一種方法:

WITH CTE AS (
    SELECT username, value, 1 AS tbl 
    FROM t1 
    UNION 
    SELECT username, value, 2 AS tbl 
    FROM t2 
    UNION 
    SELECT username, value, 3 AS tbl 
    FROM t3 
), 
CTECnt AS (
    SELECT username, COUNT(DISTINCT tbl) tblCnt 
    FROM CTE 
    GROUP BY username 
), 
CTEMaxCnt AS (
    SELECT COUNT(DISTINCT tbl) MaxCnt 
    FROM CTE 
) 
SELECT C.username, C.value 
FROM CTE C 
    JOIN CTECnt C2 ON C.username = C2.username 
    JOIN CTEMaxCnt C3 ON C2.tblCnt = C3.MaxCnt 
+0

如果我使用UNION,來自USER2的元素也出現在決賽桌上 – DrNoone

+0

@DrNoone - 你能解釋爲什麼你想要user1和3而不是user2嗎?你只想要所有表中存在的那些? – sgeddes

+0

對,這就是我想要的。只有在所有表中存在的用戶。 – DrNoone