簡體   English   中英

SQL-一對多連接與左外部連接

[英]SQL - One to Many join with left outer join

SQL Server 2008 R2

我有2張桌子

表格1

Col1 Col2 Col3 Col4
123   08   1    1
123   08   1    1
123   08   2    1

表2

Col1 Col2 Col3
123   08   6

表1是主列,因此大多數數據都來自該表,並且它必須是對Table2的LEFT OUTER JOIN,因為Table1的值(col1,col2)並不總是在TABLE2中返回值,因此應顯示為NULL。

我的查詢是

SELECT
  a.Col2,
  SUM(a.Col3),
  SUM(a.Col4),
  SUM(b.Col3)
FROM
  Table 1 a
  LEFT OUTER JOIN Table2 b
    ON a.col1 = b.col1 AND a.col2 = b.col2
GROUP BY a.Col2

這將返回08、4、3、18

我希望它返回08、4、3、6

因為表2在3行上聯接,所以它將b.Sol3的SUM值增加了三倍。

最好的解決方案是什么?

如果不想b.Col3記錄,可以將b.Col3添加到GROUP BY:

SELECT
  a.Col2,
  SUM(a.Col3),
  SUM(a.Col4),
  b.Col3
FROM
  Table 1 a
  LEFT OUTER JOIN Table2 b
    ON a.col1 = b.col1 AND a.col2 = b.col2
GROUP BY a.Col2, b.Col3

請嘗試這個。 如果您在表2中有兩個相同的col1和col2記錄,這也將引起注意。

SELECT 
a.Col2,
SUM(a.Col3),
SUM(a.Col4),
MAX(b.Col3) FROM
Table 1 a
LEFT OUTER JOIN (select col1, col2, sum(col3) as col3 from Table2 group by col1, col2) b ON a.col1 = b.col1 AND a.col2 = b.col2
GROUP BY
a.Col2

如果您在第四欄想要的結果不是總和,那么目前還不清楚想要什么。 如果您可以依靠每個組的所有行在該列中具有相同的值(在您的示例中將具有相同的值,但可能不會具有不同的數據),並且如果這是您想要的值,則可以使用此值:

SELECT
  a.Col2,
  SUM(a.Col3),
  SUM(a.Col4),
  MIN(b.Col3)
FROM
  Table 1 a
  LEFT OUTER JOIN Table2 b
    ON a.col1 = b.col1 AND a.col2 = b.col2
GROUP BY a.Col2

當然,您也可以使用MAX()而不是MIN()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM