5

这是我的第一张桌子。

表格1

然后第二个是

表2

现在我正在尝试像这样进行左连接

SELECT t1.StackID FROM t1 LEFT JOIN t2 on t1.StackID=t2.StackID

输出

输出

我在这里很困惑,这是正确的输出吗?这不应该只返回左侧表中存在的 5 行吗?

4

5 回答 5

4

是正确的输出。您正在这样做LEFT JOIN,因此对于 LEFT 表中的每条记录,DBMS 将“连接”相应的 RIGHT 表记录(-s)(如果条件没有对应的记录,则为 NULL JOIN;还请记住,如果有超过 1 个对应的记录-所有人都将被加入 - 这个问题就是为什么你不仅从 1-st 表中获得 5 条记录)。

您要实现的目标应该由任一DISTINCT修饰符完成,即

SELECT DISTINCT t1.StackID FROM t1 LEFT JOIN t2 ON t1.StackID=t2.StackID;

更多关于 SQL 中的 JOIN 的信息,您可以在此处阅读。

于 2013-09-04T12:46:02.043 回答
2

有一个简单的左连接示例:-

SELECT * FROM a JOIN b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) 
WHERE b.key=d.key;
于 2013-09-04T12:48:37.250 回答
1

这些额外的重复值StackId来自join,仅用于DISTINCT获取这 5 个值:

SELECT DISTINCT t1.StackID 
FROM t1 
LEFT JOIN t2 on t1.StackID=t2.StackID;
于 2013-09-04T12:43:16.580 回答
1

是的,这是预期的输出。

要获取不同的 ID,请使用DISTINCT-

SELECT DISTINCT t1.StackID 
FROM t1 
LEFT JOIN t2 
ON t1.StackID=t2.StackID

当您使用based on离开加入t2表时,数据库会将的每一行与具有相同值的每一行联接。由于作为值出现在表中的六行中,因此它们都与. 对于所有其他值,类似的情况也是如此。t1stackIDt2t1stackID1t2stackIDt1

于 2013-09-04T12:44:24.180 回答
0

为了让自己对左连接的工作原理有更多的了解,试试这个:

SELECT t1.StackID, t2.StackID FROM t1 LEFT JOIN t2 on t1.StackID=t2.StackID

基本上,左连接返回左表中的所有行加上右表中的匹配行。

于 2013-09-04T12:50:06.887 回答