多个表上的SQL连接,语句混淆

时间:2015-12-07 18:44:02

标签: sql sql-server view

我有一个连接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次...左连接应该只从左表返回一次?不是吗?

真正的问题是左外连接不会最终为每个左表记录返回一行。

2 个答案:

答案 0 :(得分:2)

  

左连接应该只返回左表中的所有内容

否 - LEFT JOIN将返回右侧表中每个匹配记录的记录,如果右侧没有匹配则返回单个记录。此外,由于您在左侧加入后使用内部联接,如果CD中存在多个匹配项,您将获得更多记录。

如果你想从右侧获得一条记录,你可能需要一个子查询来指定你想要的“一条”记录(最大值基于某些标准?)。在SQL Server中,您可以使用分区根据某些条件在每个“组”中指定行号,使用多个连接表进行bur可能会非常复杂。

答案 1 :(得分:0)

如果表ACH_COMM_ITEM(B)包含NO_COMM的重复值,则会从ACH_COMM(A)复制这些行。