объединять таблицы, связанные друг с другом, с помощью таблицы ссылок, чтобы не волноваться, если в таблице ссылок отсутствуют некоторые данные - PullRequest
2 голосов
/ 14 декабря 2010

У меня есть простая реляционная база данных, настроенная аналогично приведенному ниже примеру

[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

Как вы можете видеть, Джим имелв таблице ссылок нет связанных данных, и я хочу избежать размещения фиктивных данных, с помощью которых я могу связать всех людей, у которых нет группы, чтобы я мог вернуть эти данные.

Я использую запрос

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

В котором, как вы видите, отсутствует Джим, потому что у него не было связанной группы.Как я могу получить результаты, которые я действительно хочу?

Приветствия

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010
1 голос
/ 14 декабря 2010

Попробуйте использовать OUTER join

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;
...