无法连接三个表并从一个表中返回所有记录

时间:2013-12-05 13:08:33

标签: sql sql-server join

我正在使用SQL Server Express 2012和SS Management Studio以及一般的数据库。 尽管有很多时间和研究,但我无法通过特定的存储过程实现我的目标,并且在没有一些建议的情况下无法继续前进。

我想从三个相关的表A,B和C中检索数据。 我希望得到TableA中的所有行,只有表TableB和TableC中的相关行(如果它们存在)。

我在StackOverflow上发现了this link,它与我的问题最匹配,我试过没有成功。代码段如下:

SELECT A.*
FROM
  (TableA A LEFT JOIN TableB B ON A.id = B.a_id)
  LEFT JOIN TableC C ON A.id = C.a_ID 

现在,此代码具有与TableA(A.id)相关的TableB(B.a_id)和TableC(C.a_id)BOTH的相关“ID”字段。

在我的情况下,TableA与TableB相关,TableC与TableB相关。对于每个TableA记录,我希望从TableA返回的所有记录与其他两个表中的几个“描述性”字段一起返回。 我返回的记录超出了我的要求,那么如何将输出过滤到TableA中的记录?

任何人都可以建议我应该做些什么来解决这个问题。

重要编辑

对不起大家 - 只是为了澄清阅读你的出色回复..

我只想返回TableA中的所有行。我包括TableB和TableC只是为每个行返回适当的列。

进一步编辑信息

简单来说,我的背景与此类似:

TableA是员工表。它有两列:EmployeeID,EmployeeName

TableB是Depts表。它有三列DeptID,DeptName,EmployeeID

TableC是Firms的表格。它有三列FirmID,FirmName,DeptID

我想要一个所有Employees列表(即TableA中的所有行)放入用户可以选择的列表框(在Excel VBA中)。在列表框中,我想要向用户显示TableB和TableC中的相应列:

EmployeeID,EmployeeName,FirmName,DeptName

我正在寻找实现此目的的逻辑和查询代码

2 个答案:

答案 0 :(得分:3)

当您连接表时,您不会从不同的表中获取不同表中的记录,而是将所有表中的数据提取到同一结果行中。

只需在SELECT

中的表格中添加所需的字段即可
SELECT
  A.*,
  B.Something,
  C.Something
FROM
  TableA A
  LEFT JOIN TableB B ON A.id = B.a_id
  LEFT JOIN TableC C ON A.id = C.a_ID

请注意,您始终会获得TableBTableC表的值,即结果总是相同的列数。如果TableBTableC没有相应的记录,则结果中的该字段将为null

(另请注意;在*中使用SELECT对于实际应用程序代码并不是一个好习惯。您应该在最终代码中从A表中指定所需的字段。)

编辑:

如果TableB中的每条记录TableCTableA中有多条记录,并且结果仍然只需要一条记录,则必须决定如何处理来自TableBTableC的多个值。

要处理您要对来自TableA的值进行分组,并对来自TableBTableC的值使用聚合。例如,获取CountTableA字段与PriceTableB字段平均值的总和:

SELECT
  A.Id,
  A.Name,
  SUM(B.Count) TotalCount,
  AVG(C.Price) AveragePrice
FROM
  TableA A
  LEFT JOIN TableB B ON A.id = B.a_id
  LEFT JOIN TableC C ON A.id = C.a_ID
GROUP BY
  A.Id,
  A.Name

答案 1 :(得分:0)

在示例SQL中,您有以下关系图TableC => TableA <= TableB,但您有以下关系:TableA <= TableB <= TableC。所以你必须写如下:

SELECT *
FROM Table1 t1 
    JOIN TableB t2 ON t1.Id = t2.a_Id
    JOIN TableC t3 ON t2.Id = t3.b_Id