将两个不同的表与公共列上的公共第三表联接

时间:2019-12-06 01:13:08

标签: sql sql-server tsql sql-server-2012

这是桌子

表:状态

ID, StatusDesc
1,  New
2,  Active
3,  Cancelled
4,  Complete

表:顺序(与上面的状态表的外键关系)

ID, OrderNumber, StatusID
1,  1001 , 1
2,  1002,  1
3,  1003, 2
4,  1004, 3
5,  1500, 4

表:LineItem(与上述“订单和状态”表的外键关系)

ID, OrderNumber, LineItemNumber, StatusID
1,  1001 , 1, 1
2,  1001 , 2, 1
3,  1002 , 1, 2
4,  1002 , 2, 1
5,  1003 , 1, 2
6,  1004 , 1, 3
7,  1004 , 2, 4
8,  1500 , 1, 3

如您所见,状态表保留了Order表和LineItem表的通用状态。

我想产生的结果将包括这样的列,Order和LineItem的状态描述:

OrderNumber, LineItemNumber, StatusDesc_Order, StatusDesc_LineItem

该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以两次连接状态表以实现此目的:

SELECT
           o.OrderNumber
         , li.LineItemNumber
         , orderStatus.StatusDesc    AS StatusDesc_Order
         , lineItemStatus.StatusDesc AS StatusDesc_LineItem
FROM       [LineItem] AS li
INNER JOIN [Status]   AS lineItemStatus ON li.StatusID = lineItemStatus.ID
INNER JOIN [Order]  AS o ON li.OrderNumber = o.OrderNumber
INNER JOIN [Status]   AS orderStatus ON o.StatusID = orderStatus.ID

我确实建议您不过尝试使用诸如Order和Status之类的保留关键字来避免使用表名,这也是一个好习惯,在查询中的表名之前明确添加模式前缀(例如dbo.Status或其他用户定义的模式) )。

答案 1 :(得分:1)

如果所需结果确实如此简单,则只需使用几个子查询,例如

-- SETUP TEST DATA

declare @Order table (id int, OrderNumber int, StatusId int)

insert into @Order (id, OrderNumber, StatusId)
  values (1, 1001, 1), (2, 1002, 1), (3, 1003, 2), (4, 1004, 3), (5, 1500, 4)

declare @LineItem table (id int, OrderNumber int, LineItemNumber int, StatusId int)

insert into @LineItem (id, OrderNumber, LineItemNumber, StatusId)
  values (1, 1001, 1, 1), (2, 1001, 2, 1), (3, 1002, 1, 2), (4, 1002, 2, 1), (5, 1003, 1, 2), (6, 1004, 1, 3), (7, 1004, 2, 4), (8, 1500, 2, 3)

declare @Status table (id int, StatusDesc varchar(32))

insert into @Status(id, StatusDesc)
  values (1,'New'), (2,'Active'), (3,'Cancelled'), (4,'Complete')

-- QUERY DATA

select LI.OrderNumber, LI.LineItemNumber
  , (select S.StatusDesc from @Status S where S.id = StatusId) [StatusDesc_Order]
  , (select S.StatusDesc from @Status S where S.id = (select O.StatusId from @Order O where O.OrderNumber = LI.OrderNumber)) [StatusDesc_LineItem]
from @LineItem LI
order by LI.OrderNumber, LI.LineItemNumber

注意:如果您在以后的问题中以这种格式提供示例数据,则会使问题更容易回答。

相关问题