SQL LEFT JOIN и WHERE дает неожиданный результат - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть две таблицы, связанные полем, называемым «статус». С table2.location, имеющим значение 'texas', есть 20 экземпляров table2.status, имеющих значение 'good'.

То есть следующий запрос возвращает 20 строк table2.status = 'good'.

[A] SELECT table2.status FROM table2 WHERE table2.location = 'texas';

Далее, есть 50 уникальных таблиц table1.id с table1.status = 'good'.

То есть следующий запрос возвращает 50 строк уникального table1.id.

[B] SELECT table1.id FROM table1 WHERE table1.status = 'good';

Теперь, когда я запускаю следующий запрос:

[C] SELECT table1.id FROM table1 LEFT JOIN table2 ON table1.status = table2.status WHERE table2.location = "texas";

Я ожидаю, что он вернет 50 строк уникальных идентификаторов. Тем не менее, он на самом деле возвращает 50 строк уникального идентификатора 20 раз (т. Е. Я возвращаю 1000 строк).

Я быстро исправил это, выполнив SELECT DISTINCT table1.id ..., который затем просто возвращает один набор из 50 строк (а не 20 наборов из 50 строк).

Однако я хотел бы знать, почему я вижу такое поведение - возможно, что-то не так с моим запросом [C]?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

ожидается.1-я строка из таблицы 1 соответствует 50 строкам из таблицы 2, 2-я строка из таблицы 1 снова совпадает с теми же 50 строками из таблицы 2 и т. Д.

2 голосов
/ 15 февраля 2012

Ваш запрос неверен, если вы хотите получить 50 элементов: вы выполняете перекрестное объединение 50x20, поэтому в результате получается 1000 записей.
Вы не можете присоединиться по статусу (который не уникален): возможно, ваша таблицадизайн неправильный.
IMO, вы должны иметь идентификатор в обеих таблицах и присоединиться к нему ...

1 голос
/ 16 февраля 2012

В вашем запросе есть две проблемы

SELECT table1.id 
FROM table1 
LEFT JOIN table2 ON table1.status = table2.status 
WHERE table2.location = "texas";

Во-первых, когда вы используете левое соединение, условие во второй таблице должно быть в условии ON, а не в предложении where, или вы преобразуете левое соединение во внутреннее соединение.(Поскольку условие должно быть выполнено)

Таким образом, ваш запрос должен начать выглядеть следующим образом:

SELECT table1.id 
FROM table1 
LEFT JOIN table2 
    ON table1.status = table2.status 
    AND table2.location = "texas";

Теперь ваша следующая проблема заключается в том, что статус вряд ли будет тем, к которому вы действительно хотите присоединитьсяна.Чтобы помочь вам получить желаемые результаты, нам нужно увидеть структуру таблиц двух таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...