Sql 通过链接表组合彼此相关的表,不用担心链接表是否缺少某些数据
我有一个简单的关系数据库设置,类似于下面的示例Sql 通过链接表组合彼此相关的表,不用担心链接表是否缺少某些数据,sql,ms-access,join,relational-database,Sql,Ms Access,Join,Relational Database,我有一个简单的关系数据库设置,类似于下面的示例 [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
[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
正如您所见,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
正如你所看到的,吉姆失踪是因为他没有相关的团体。
我怎样才能得到我真正想要的结果
干杯尝试使用外部联接
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;
此外,您可能应该切换到ANSI连接语法。在这种情况下,使用Jet/ACE作为目标数据库,可能不会有太大区别,因为Jet/ACE完全相同地优化等效的隐式和显式连接。我认为在大多数情况下,连接是一个更好的主意,特别是当连接位于外键关系上时,但是隐式连接不一定有任何错误。谢谢,我发现我需要在第一个左连接周围使用括号来“避免歧义”。
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;