Многостоловые объединения - можно ли добавить к этому внешнее соединение? - PullRequest
0 голосов
/ 11 ноября 2010

У меня проблема при переходе от ситуации, когда работает внешнее соединение, к месту, где оно не работает.

Рабочая (пример псевдокода)

SELECT a.number, a.name, b.ref, c.ref, c.firmref
FROM jobs a, teams b LEFT OUTER JOIN teamfirms c ON b.ref = c.team
WHERE a.ref = b.job

Между заданиями и командами существует много-одно отношение (много команд на задание), всегда заполнено

В таблице c могут быть или не быть фирмы, но приведенный выше запрос дает мне ожидаемый результат (около 5000 записей)

Проблема возникает, когда я хочу представить подробности о командах из четвертого стола

Код, который я пытаюсь найти ниже

SELECT a.number, a.name, b.ref, c.ref, c.firmref, d.name
FROM jobs a, teams b LEFT OUTER JOIN teamfirms c ON b.ref = c.team, firms d
WHERE a.ref = b.job
AND d.ref = c.firmref

В этот момент пропадающие NULLs исчезают, и я сбрасываю около 500 записей

Что я делаю не так?

Ответы [ 5 ]

4 голосов
/ 11 ноября 2010

ударить в этом.

select a.number, a.name, b.ref, c.ref, c.firmref, d.name
from jobs a left outer join teams b on b.job = a.ref
left outer join teamfirms c on b.ref = c.team
left outer join firms d on c.firmref = d.ref
left outer join table e on a.column = e.column

или вы можете сделать

select a.number, a.name, b.ref, c.ref, c.firmref, d.name
from
jobs a, teams b, teamfirms c, firms d
where
a.ref = b.job
and b.ref = c.team
and c.firmref = d.ref

один или другой ... не оба.

Просто броситьэто для хорошей меры ...

Вы используете INNER JOIN, чтобы вернуть все строки из обеих таблиц, где есть совпадение.то есть.в полученной таблице все строки и столбцы будут иметь значения.

LEFT OUTER JOIN возвращает все строки из первой таблицы, даже если во второй таблице нет совпадений.

RIGHT OUTER JOIN возвращает все строки из второй таблицы, даже если в первой таблице нет совпадений.

4 голосов
/ 11 ноября 2010

Вы смешиваете синтаксис ANSI 89 и 92 JOIN (неявное и явное JOIN). Попробуйте преобразовать весь запрос в явные соединения. Проблема, вероятно, в том, что добавляемый вами новый JOIN (неявный синтаксис) имеет значение INNER и хочет быть OUTER, или что вы хотите разрешить JOIN в другом порядке (что можно сделать с паренами, когда вы все их напишите как OUTER). соединения)

0 голосов
/ 11 ноября 2010

Вот моя попытка:

SELECT a.number, a.name, b.ref, c.ref, c.firmref, d.name 
FROM jobs a
 join teams b on (b.job = a.ref)
 LEFT OUTER JOIN teamfirms c ON (b.ref = c.team)
 LEFT OUTER JOIN firms d on (d.ref = c.firmref)

Это объединит все рабочие места в команду, и если есть командная фирма, то также предоставьте подробные данные. если нет командных прочных отношений, вы все равно получаете свои нули.

0 голосов
/ 11 ноября 2010

Попробуйте следующее:

SELECT 
  a.number, a.name, b.ref, c.ref, c.firmref, d.name 
FROM 
 jobs a, teams b 
     LEFT OUTER JOIN teamfirms c ON b.ref = c.team
        LEFT OUTER JOIN firms d on c.firmref = d.ref
WHERE a.ref = b.job 

Если это сработает, вы можете попытаться превратить 2-й ЛЕВОЙ ВНЕШНИЙ ВНУТРЕННИЙ.Возможно, неправильно, я обычно оставляю это как внешнее, когда мне нужны такие вещи.

0 голосов
/ 11 ноября 2010

Попробуйте следующее:

SELECT a.number, a.name, b.ref, c.ref, c.firmref, d.name
FROM jobs a, teams b LEFT OUTER JOIN teamfirms c ON b.ref = c.team
LEFT OUTER JOIN firms d ON c.firmref = d.ref
WHERE a.ref = b.job
...