SQL多对多JOIN

时间:2015-11-24 12:09:43

标签: sql sql-server join many-to-many

我很难加入两张桌子。

我有桌子

Customer_table
 ---------------------------------------
| CustomerId(PK) | Firstname | Lastname |
 ---------------------------------------

CustomerInterest_table
 ----------------------------------------
| CustomerId(PK,FK) | InterestId(PK,FK)  |
 ----------------------------------------

Interest_table
 -------------------------------
| InterestId(PK) | InterestInfo |
 -------------------------------

我想要做的是选择每个客户,并将福利与桌面上的FK参考相结合。

最终我想获取一个结果,其中包含从customer表中获取的客户,以及从CustomerInterest_table获取的客户兴趣。

我想建立像这样的对象

{
customerId : 'Id12345,
firstname : 'John', 
lastname : 'Doe', 
interests : [{interestId : 1, interestInfo : 'Apples'}]
}

我如何获取和加入表格? 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

数据库设计(First Normal Form)假设该列应该是简单类型,在这种情况下它意味着没有数组。相反,您可以从多个选定的行中获取所需的内容:

SELECT customerId, firstname, lastname, interestId, InterestInfo 
    FROM Customer_table c
    INNER JOIN CustomerInterest_table tc
        ON c.customerId = tc.customerId
    INNER JOIN Interest_table i 
        ON tc.InterestId = i.InterestId
ORDER BY customerId

最后ORDER BY允许您强制执行行的顺序,以便同一个客户的兴趣将逐一进行。

或者,如果客户可能没有兴趣,您可以利用LEFT JOIN(然后两列interestId,InterestInfo将为NULL)

SELECT customerId, firstname, lastname, interestId, InterestInfo 
    FROM Customer_table c
    LEFT OUTER JOIN CustomerInterest_table tc
        ON c.customerId = tc.customerId
    INNER JOIN Interest_table i 
        ON tc.InterestId = i.InterestId
ORDER BY customerId

<强>更新

或者(如果您真的想要任何成本的单列中的所有内容)您可以将结果转换为XML数据类型,那么Last列将组成复杂的XML:

SELECT customerId, firstname, lastname
 , [Name]
 , (STUFF((SELECT CAST(', ' + interestId AS VARCHAR(MAX) + ':' + InterestInfo) 
     FROM Interest_table i
     WHERE tc.InterestId = i.InterestId
     FOR XML PATH ('')), 1, 2, '')) AS interests 
FROM Customer_table c
    INNER JOIN CustomerInterest_table tc
        ON c.customerId = tc.customerId

(p.s. sorry语法未检查正确性)