Я хотел выполнить простой запрос, чтобы выбросить все строки, Table1
где значение основного столбца отсутствует в столбце другой таблицы ( Table2
).
Я пытался с помощью:
SELECT * FROM Table1 WHERE Table1.principal NOT IN Table2.principal
Вместо этого это вызывает синтаксическую ошибку. Поиск в Google привел меня на форумы, где люди говорили, что MySQL не поддерживает, NOT IN
и нужно использовать что-то чрезвычайно сложное. Это правда? Или я совершаю ужасную ошибку?
Ответы:
Чтобы использовать IN, у вас должен быть набор, используйте этот синтаксис:
источник
table2.principal
можноNULL
. В этом случаеNOT IN
всегда будет возвращаться,FALSE
потому чтоNOT IN
рассматривается как<> ALL
, что сравнивает все строки из подобного подзапросаTable1.principal <> table2.principal
, что не удается при сравнении сNULL
:Table1.principal <> NULL
не приведет кTRUE
. Чтобы исправить:NOT IN (SELECT principal FROM table2 WHERE principal IS NOT NULL)
.Опция подзапроса уже получена, но обратите внимание, что во многих случаях a
LEFT JOIN
может быть более быстрым способом сделать это:Если вы хотите проверить несколько таблиц, чтобы убедиться, что они отсутствуют ни в одной из таблиц (как в комментарии SRKR), вы можете использовать это:
источник
NOT IN
иLEFT JOIN
. +1 обаНЕ В, против НЕ СУЩЕСТВУЕТ, ПРОТИВ ЛЕВОГО СОЕДИНЕНИЯ / НУЛЬ В MySQL
[...]
[...]
[...]
(выделено)
источник
К сожалению, похоже, проблема с использованием MySql предложения «NOT IN», на снимке экрана ниже показан вариант подзапроса, возвращающий неверные результаты:
источник
Будьте осторожны,
NOT IN
это не псевдоним для<> ANY
, но для<> ALL
!http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html
не может быть заменено
Вы должны использовать
источник