SQL - 一对多与左外连接连接

时间:2014-11-13 20:41:35

标签: sql sql-server join sql-server-2008-r2

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是主列,因此大多数数据来自此表,并且它必须是表2上的LEFT OUTER JOIN,因为Table1的值(col1,col2)不总是返回TABLE2中的值并且应该显示为NULLS

我的查询是

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.Col3

的SUM值增加了三倍

什么是最好的解决方案?

3 个答案:

答案 0 :(得分:1)

如果您不想对记录求和,可以将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

答案 1 :(得分:0)

请试试这个。如果table2中有两个记录用于相同的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

答案 2 :(得分:0)

如果第四列中您想要的结果不是总和,那么您不清楚想要的是什么。如果您可以依赖每个组的所有行在该列中具有相同的值(它们将在您的示例中,但可能不具有不同的数据),并且如果那是您想要的值,那么你可以用这个:

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()