Если вы избавитесь от приставки IF
, IN()
и EXISTS()
сделать работу таким образом.
Во-первых, версия, использующая IN()
, как правило, представляет собой плохую идею ™ - с точки зрения производительности, вам гораздо лучше использовать JOIN или производную таблицу, а не подзапрос в предложении WHERE.
-- instead of:
SELECT * FROM tbl1 WHERE tbl1.v_short IN (SELECT tbl2.sname FROM tbl2)
-- you would want something like:
SELECT tbl1.* FROM tbl1 JOIN tbl2 ON (tbl2.sname = tbl1.v_short)
EXISTS()
с другой стороны очень полезно. Он оптимизирован так, чтобы быть идентичным INNER JOIN, а NOT EXISTS()
идентичен LEFT JOIN с проверкой IS NULL. Версия [NOT] EXISTS()
просто читается так, как будто это был английский. Обратите внимание, что нет смысла передавать список столбцов SELECT в EXISTS - он не используется, он оптимизируется как SELECT * каждый раз.
-- easy to read:
SELECT * FROM tbl1 WHERE EXISTS (SELECT * FROM tbl2 WHERE tbl2.sname = tbl1.v_short)
-- same thing, just more SQL-like than English-like:
SELECT tbl1.* FROM tbl1 JOIN tbl2 ON (tbl2.sname = tbl1.v_short)
Можете ли вы написать вопрос, который вы пытаетесь ввести в код? –
Аналогичный вопрос: http://stackoverflow.com/questions/24929/difference-between-exists-and-in-in-sql – Verma
@Verma Как это похоже на вопрос. Попробуйте снова прочитать мой вопрос – kushalvm