我有一个连接4个表的查询:
SELECT A.NO_COMM,
B.CODE_ART,
C.NO_PROJ,
D.RSN_SOC
FROM ACH_COMM AS A LEFT OUTER JOIN
ACH_COMM_ITEM AS B ON B.NO_COMM = A.NO_COMM JOIN
FIN_FOUR AS C ON C.NO_FOUR = A.NO_FOUR JOIN
ACH_COMM_ITEM_CMPT AS D ON D.NO_ITEM_COMM = B.NO_ITEM_COMM
WHERE ...Whatever
GROUP BY ...Everything
我想在这里发生的事情如下:
表A的所有行只返回一次,如果存在其他表的信息。因此返回的行数应该等于A中的记录量。NO_COMM
女巫是表A的主键,不应该使用相同的数字显示两次。
但我有相同的NO_COMM
显示167次...左连接应该只从左表返回一次?不是吗?
真正的问题是左外连接不会最终为每个左表记录返回一行。
答案 0 :(得分:2)
左连接应该只返回左表中的所有内容
否 - LEFT JOIN
将返回右侧表中每个匹配记录的记录,如果右侧没有匹配则返回单个记录。此外,由于您在左侧加入后使用内部联接,如果C
和D
中存在多个匹配项,您将获得更多记录。
如果你想从右侧获得一条记录,你可能需要一个子查询来指定你想要的“一条”记录(最大值基于某些标准?)。在SQL Server中,您可以使用分区根据某些条件在每个“组”中指定行号,使用多个连接表进行bur可能会非常复杂。
答案 1 :(得分:0)
如果表ACH_COMM_ITEM(B)包含NO_COMM的重复值,则会从ACH_COMM(A)复制这些行。