2016-03-03 71 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

相关问题