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

Я хочу left join две таблицы. Моя проблема в том, что таблица из "справа" не существует в базе данных. Мне нужно создать его во время запроса. Более подробно, «правильная» таблица получается путем извлечения (select ... where ...) определенных строк из существующей таблицы.

Я думал, что решение будет сначала join, а затем select. Я думал, что это будет просто медленнее, чем elect и join, но потом я понял, что это не будет работать вообще.

Например:

Левый стол:

| Dog | 1 |
| Cat | 0 |

Правый стол:

| Dog | Paul | yes |
| Cat | Carin | no |

Я хочу использовать только те строки из второй таблицы, где во втором столбце есть "Carin". Итак, если я присоединяюсь после выбора этих строк, я получаю:

| Dog | 1 | Null | Null|
| Cat | 0 | Carin | no |

Но если я впервые присоединюсь, я получу:

| Dog | 1 | Paul | yes |
| Cat | 0 | Carin | no |

А потом, если я выберу строки с Карин, я получу:

| Cat | 0 | Carin | no |

Итак, вы видите, что результат другой. В первом случае я получаю 2 строки, а во втором - только 1 строку.

Итак, можно ли выбрать до объединения?

Ответы [ 3 ]

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

Я думаю, что вы говорите о ссылках на поля, созданные в подзапросе, определенном как часть оператора соединения.Примерно так:

SELECT a.id, b.name 
   FROM table AS a
   LEFT JOIN
     (SELECT name FROM table2) AS b
   ON a.id = b.id

Здесь вы ссылаетесь на b.name, даже если b.name существует только как часть подзапроса, созданного позже в запросе.

Если эточто вы имеете в виду, то да, вы абсолютно можете это сделать.Если вы не смогли бы присоединиться к подзапросу, было бы очень мало причин.

Если я ошибаюсь в ваших намерениях, добавьте фактический запрос, который вы хотели бы выполнить, к своему вопросу, чтобы я мог видетьпроблема яснее.

1 голос
/ 11 декабря 2010

Вы также можете присоединиться к константе.По сути, вы перемещаете выражение в предложении WHERE в предложение ON:

SELECT a.pet, a.neutered, b.name, b.allergic
  FROM a
  LEFT JOIN b
    ON a.pet=b.pet AND b.name='Carin';
0 голосов
/ 24 мая 2017

Пример из Outis у меня не сработал, но это сработало, когда я заменил AND на WHERE.

SELECT a.pet, a.neutered, b.name, b.allergic
  FROM a
  LEFT JOIN b
    ON a.pet=b.pet WHERE b.name='Carin';
...