这是我的第一张桌子。
然后第二个是
现在我正在尝试像这样进行左连接
SELECT t1.StackID FROM t1 LEFT JOIN t2 on t1.StackID=t2.StackID
输出
我在这里很困惑,这是正确的输出吗?这不应该只返回左侧表中存在的 5 行吗?
是正确的输出。您正在这样做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 的信息,您可以在此处阅读。
有一个简单的左连接示例:-
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;
这些额外的重复值StackId
来自join
,仅用于DISTINCT
获取这 5 个值:
SELECT DISTINCT t1.StackID
FROM t1
LEFT JOIN t2 on t1.StackID=t2.StackID;
是的,这是预期的输出。
要获取不同的 ID,请使用DISTINCT
-
SELECT DISTINCT t1.StackID
FROM t1
LEFT JOIN t2
ON t1.StackID=t2.StackID
当您使用based on离开加入t2
表时,数据库会将的每一行与具有相同值的每一行联接。由于作为值出现在表中的六行中,因此它们都与. 对于所有其他值,类似的情况也是如此。t1
stackID
t2
t1
stackID
1
t2
stackID
t1
为了让自己对左连接的工作原理有更多的了解,试试这个:
SELECT t1.StackID, t2.StackID FROM t1 LEFT JOIN t2 on t1.StackID=t2.StackID
基本上,左连接返回左表中的所有行加上右表中的匹配行。