【问题标题】:combine tables related to each other by a linking table and not to worry if the linking table is missing some data通过链接表组合彼此相关的表,如果链接表丢失了一些数据,不用担心
【发布时间】:2011-05-25 11:34:09
【问题描述】:

我有一个类似于下面示例的简单关系数据库设置

[Customer] --< [CGLink] >-- [Order]

Person:
Alias Name(PK)
A     Bill
B     Ben
C     Bob
D     Jim
E     John

CGLink:
ID(PK) Alias Type
1      A     W
2      A     X
3      B     W
4      B     X
5      B     Y
6      B     Z
7      C     Y
8      E     Z

Group:
Type(PK) Group
W        Double-U
X        Eks
Y        Whai
Z        Zed

我想返回一组结果,例如

Alias   Name   Group
A       Bill   Double-U
A       Bill   Eks
B       Ben    Double-U
B       Ben    Eks
B       Ben    Whai
B       Ben    Zed
C       Bob    Whai
D       Jim    
E       John   Zed

如您所见,Jim 在链接表中没有关联数据,我想避免放置一行虚拟数据,我可以将所有没有群组的人链接到这些数据,以便让我返回这个数据。

我使用的查询是

SELECT p.Alias, p.Name, g.Group
FROM Person AS p, Group AS s, CGLink AS l
WHERE (p.Alias=l.Alias
AND l.Type=s.Type)
ORDER BY p.Alias, p.Name;

返回

Alias   Name   Group
A       Bill   Double-U
A       Bill   Eks
B       Ben    Double-U
B       Ben    Eks
B       Ben    Whai
B       Ben    Zed
C       Bob    Whai
E       John   Zed

如您所见,缺少 Jim 是因为他没有关联的组。 我怎样才能得到我真正想要的结果?

干杯

【问题讨论】:

    标签: sql ms-access join relational-database


    【解决方案1】:

    【讨论】:

    • 另外,您可能应该切换到 ANSI 连接语法。stackoverflow.com/questions/3684259/…
    • 在这种情况下,使用 Jet/ACE 作为目标数据库,它可能不会有太大的不同,因为 Jet/ACE 优化等效的隐式和显式连接完全相同。我认为在大多数情况下,JOIN 是一个更好的主意,特别是当 JOIN 位于外键关系上时,但隐式连接不一定有任何问题。
    【解决方案2】:

    尝试使用外连接

    SELECT p.Alias, p.Name, g.Group
    FROM Person AS p
    LEFT OUTER JOIN Group AS s ON p.Alias=l.Alias
    LEFT OUTER JOIN CGLink AS l ON l.Type=s.Type
    ORDER BY p.Alias, p.Name;
    

    【讨论】:

    • 谢谢,我发现我需要在第一个 LEFT JOIN 周围使用括号来“避免歧义”。
    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多