我正在使用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
我正在寻找实现此目的的逻辑和查询代码
答案 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
请注意,您始终会获得TableB
和TableC
表的值,即结果总是相同的列数。如果TableB
或TableC
没有相应的记录,则结果中的该字段将为null
。
(另请注意;在*
中使用SELECT
对于实际应用程序代码并不是一个好习惯。您应该在最终代码中从A表中指定所需的字段。)
如果TableB
中的每条记录TableC
或TableA
中有多条记录,并且结果仍然只需要一条记录,则必须决定如何处理来自TableB
或TableC
的多个值。
要处理您要对来自TableA
的值进行分组,并对来自TableB
和TableC
的值使用聚合。例如,获取Count
中TableA
字段与Price
中TableB
字段平均值的总和:
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