如何加入多对多的关系

时间:2014-01-01 16:28:28

标签: sql sql-server join

我正在尝试连接三个与单个查询具有One-to -Many关系的表,我不确定如何定义连接。我已经在下面绘制了一个表格结构的清理版本,其中有一个我想要实现的结果的例子。这可能在SQL中,如果是这样,如何。如果我的目标无法实现,还有其他可能的解决方案吗?

具体来说,我正在使用SQL Server。我探索了其他答案,而Joining 2 one to many relationships的答案似乎有些失败。但我想避免将多个结果连接成逗号分隔列表

这是关系的一方面的一个例子。这是一个存储订单数据的表格,我已将其修改为有关此问题的基本要素。

Order_Table
Order_ID Customer_ID
    1        1
    2        1

这是关系中众多方面之一的一个例子。正如您在此示例中所看到的,每个One订单可以包含多个订单项。

Line_Item_Table
Line_Item_ID Order_ID
      1         1
      2         1
      3         2
      4         2

这是关系的第二个很多方面的例子。每个单一订单可以包含零到多个订单修改器代码。

Order_Modifier_Table
Order_Modifier_ID Order_ID
       1             1
       2             1

我想要实现的结果看起来与此类似

Line_Item_ID Order_ID Order_Modifier_ID_1 Order_Modifier_ID_2
      1         1              1                   2
      2         1              1                   2
      3         2              NULL                NULL
      4         2              NULL                NULL

1 个答案:

答案 0 :(得分:0)

你可以非常流利地链接连接。如果数据库很复杂,我总是希望有一个数据库图表,所以我可以更快地使用它。

这听起来像你需要在这里PIVOT。我只是把它作为一个“正在进行的工作”把它扔在一起:

IF OBJECT_ID('LineItems') IS NOT NULL
    DROP TABLE LineItems
GO
IF OBJECT_ID('OrderModifier') IS NOT NULL
    DROP TABLE OrderModifier
GO
IF OBJECT_ID('Orders') IS NOT NULL
    DROP TABLE Orders
GO
IF OBJECT_ID('Customers') IS NOT NULL
    DROP TABLE Customers
GO

CREATE TABLE Customers (
    Id          INT PRIMARY KEY IDENTITY,
    [Name]      VARCHAR(100)
)

CREATE TABLE Orders (
    Id          INT PRIMARY KEY IDENTITY,
    CustomerId  INT FOREIGN KEY REFERENCES Customers(Id)
)

CREATE TABLE LineItems (
    Id          INT PRIMARY KEY IDENTITY,
    OrderId     INT FOREIGN KEY REFERENCES Orders(Id)
)

CREATE TABLE OrderModifier (
    Id          INT PRIMARY KEY IDENTITY,
    OrderId     INT FOREIGN KEY REFERENCES Orders(Id)
)
INSERT INTO Customers(Name) VALUES('Customer Name')

INSERT INTO Orders(CustomerId) VALUES(1)
INSERT INTO Orders(CustomerId) VALUES(1)

INSERT INTO LineItems(OrderId) VALUES(1)
INSERT INTO LineItems(OrderId) VALUES(1)
INSERT INTO LineItems(OrderId) VALUES(2)
INSERT INTO LineItems(OrderId) VALUES(2)

INSERT INTO OrderModifier(OrderId) VALUES(1)
INSERT INTO OrderModifier(OrderId) VALUES(1)

SELECT
    li.Id   AS LineItemId,
    o.Id    AS OrderId,
    om.Id   AS OrderModifierId
FROM LineItems li
INNER JOIN Orders       o   ON li.OrderId   = o.Id
LEFT OUTER JOIN OrderModifier   om  ON o.Id     = om.OrderId

这会产生以下结果:

LineItemId  OrderId     OrderModifierId
----------- ----------- ---------------
1           1           1
1           1           2
2           1           1
2           1           2
3           2           NULL
4           2           NULL

我们现在需要PIVOT最后一栏。