在连接表上写一个独特的查询

时间:2012-11-30 19:16:10

标签: sql sql-server sql-server-2008

我有两张桌子。 ProductA和ProductB。

产品A

ID Description

A1 ProdA1
B1 ProdB1
C1 ProdC1
D1 ProdD1
E1 ProdE1

产品B

ID SubId

A1 112
A1 118
B1 111
B1 113
D1 117
D1 118
E1 115
E1 116
E1 117

我想编写一个查询,它从ProductB表中输出ProductA Table和SubId列的所有记录,这样如果ProductA中的ID存在于ProductB中,那么它将显示SubId else NULL。因此对于上面的表格,它将显示以下输出。

ID Description SubId

A1  ProdA1      112
B1  ProdB1      111
C1  ProdC1      NULL
D1  ProdD1      117
E1  ProdE1      116

我怎样才能完成这项工作?

2 个答案:

答案 0 :(得分:1)

  

如果ProductA中的ID存在于ProductB中,那么它将显示SubId else NULL

这就是LEFT OUTER JOIN的目的。否则,您选择ProductB.subIdID的最低值,这意味着aggregate MIN()

SELECT
  ProductA.ID,
  ProductA.Description,
  /* Aggregate MIN() to get the first SubId per Id */
  MIN(ProductB.SubId) AS SubId
FROM
  ProductA
  LEFT OUTER JOIN ProductB ON ProductA.ID = ProductB.ID
GROUP BY
  ProductA.ID,
  ProductA.Description

那么根据您的示例输出所寻找的内容确实不是DISTINCT集,而是聚合分组集。

Here's a demonstration on SQLFiddle.com

答案 1 :(得分:0)

LEFT JOIN两个表:

SELECT a.Id, a.description, b.subId
FROM ProductA a
LEFT JOIN
(
  SELECT Id, MIN(subId) subid
  FROM ProductB
  GROUP BY ID
)b ON a.Id = b.Id

SQL Fiddle Demo