2016-03-03 107 views
0

我有兩個表,我試圖加入爲第三個表生成一組獨特的數據,但遇到麻煩做得很好。如何連接兩個表格,每邊都有不同的列?

  • left表具有id字段,以及一個公共連接字段(a)。
  • right表具有共同連接字段(a),而另一個不同的領域(b

我試圖提取結果集的idb,那裏既沒有id也不b被複制。

我有一個SQL小提琴設置:http://www.sqlfiddle.com/#!9/208de/3/0

理想的結果應該是:

id | b 
---+--- 
1 | 1 
2 | 2 
3 | 3 

每個idb值只出現一次(這只是他們在這裏匹配的巧合,這是不能總是假設)。

謝謝

+0

有什麼可疑的。請查看http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_distinct並嘗試以下查詢:SELECT DISTINCT City,Country FROM Customers; ' – Bramastic

+0

它們在您的SQLFiddle中不匹配。如果你通過'a'加入,你最終會交叉加入。所以'id'中的每個值都與'b'中的每個值相加。此外,在你的sqlFiddle中,你有一個GROUP BY,但你只在其中包含'id'。這是一場災難。 MySQl會選擇它爲每個不同的'id'找到的第一個'b'值,這肯定是壞的和錯誤的,令人厭惡,我不喜歡MySQl,因爲它允許這樣的事情。 – JNevill

+0

只需詳細說明,您在'a'上的連接將從'left'獲取第一條記錄,然後將'1'的'a'值匹配到'right'中每個'a'爲'1'的記錄。這是三個記錄。然後,它將移動到'left'中的下一個記錄,其中'a'又是'1',它將再次在'right'中找到三個匹配的記錄,其中'a'爲'1'。然後再次爲第三條記錄。您的結果集將包含9條記錄。你最終得到一個笛卡爾產品([sqlfiddle](http://www.sqlfiddle.com/#!9/208de/44))。用什麼邏輯從這9條記錄到你想要的輸出中的3條記錄? – JNevill

回答

-1

CTE和DISTINCT有什麼關係嗎?

WITH 
    cte1 (ID, B) 
    AS 
    (
    SELECT DISTINCT Table1.ID 
    FROM Table1 
    WHERE Table1.ID IS NOT NULL 
    GROUP BY Table1.ID 
) 
SELECT DISTINCT 
    Table2.b 
FROM Table2 AS sp 
    INNER JOIN cte1 AS ts 
    ON sp.b <> ts.ID 
ORDER BY ts.ID DESC 
+0

只確保第一列不同,不能確保第二列不同 – JamShady

相關問題