SQL连接查询多个一对多关系?还是多对多关系?

3
希望这是一个简单的问题!
我有两个表,一个是“客户”表,另一个是“姓名”表。基础是一个客户可以有一个或两个(最多)姓名。我将它们结构化,以便每个“姓名”都可以有不同的称号。表格如下:
clients
+------------+-------------+------------+
| clientID   | nameID1     | nameID2    |
+------------+-------------+------------+
|          1 | 1           | 2          |
|          2 | 3           |            |
|          3 | 4           |            |
+------------+-------------+------------+


names 
+------------+-------------+------------+------------+
| nameID     | surname     | initials   | titleID    |
+------------+-------------+------------+------------+
|          1 | Banks       | P          | 1          |
|          2 | Smith       | W          | 2          |
|          3 | Wilson      | BT         | 2          |
|          4 | Jefferson   | JP         | 3          |
+------------+-------------+------------+------------+

其中titleID是从...中检索出来的。

titles 
    +------------+-------------+
    | titleID    | titleName   |
    +------------+-------------+
    |          1 | Mr          |
    |          2 | Mrs         |
    |          3 | Miss        |
    +------------+-------------+

例如,clientID = 1 表示 P Banks 先生和 W Smith 女士。

问题是我不熟悉查询以获得上面的答案。

我无法尝试:

SELECT
clientID, names.surname, names.initials, titleName
FROM clients, names, titles
WHERE titleID = titleID AND
NameID1 = nameID AND
NameID2 = nameID

如何在查询中正确地联接表格以查找例如clientID 1 = Mr P Banks '&' Mrs W Smith


抱歉,但是问题是什么? - Andrew Skirrow
@AndySkirrow 抱歉如果表述不够清晰。我想知道如何在查询中正确地连接表格,以找到例如客户ID 1 = P Banks先生 '&' W Smith女士的信息。 - tcrock
1个回答

3

您需要两次加入Names(和Titles)表,一次是nameID1,一次是nameID2。 我假设客户端必须至少拥有一个名称,因此nameID1是INNER JOIN,而namedID2是可选的(可为空),因此它是LEFT OUTER JOIN

SELECT c.clientID, n1.surname, n1.initials, t1.titleName, n2.surname, n2.initials, t2.titleName
FROM clients c
INNER JOIN names n1 ON nameID1 = n1.nameID
INNER JOIN titles t1 ON n1.titleID = t1.titleID
LEFT OUTER JOIN names n2 ON nameID2 = n2.nameID
INNER JOIN titles t2 ON n2.titleID = t2.titleID

太棒了,它正常运作。我猜我最好看一下内连接。谢谢 - tcrock
除此之外,我能显示所有的“客户”吗?目前查询只显示具有两个“名称”的客户。 - tcrock
我明白了 - 我使用LEFT OUTER JOIN ON nameID1 = n1.nameID,现在我可以看到所有客户的记录(甚至是Null nameID2的记录)。 - tcrock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接