Каков наиболее эффективный способ найти запись, значение X которой не встречается в столбце Y? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть таблица SQL со строками, и каждая строка имеет (среди прочего) два столбца, которые связаны между собой.По сути, представьте себе такую ​​структуру:

A | B    | Data
--|------|-----
1 | NULL | ...
2 | 1    | ...
3 | 2    | ...

Как видите, некоторые значения в столбце A существуют в столбце B, но не все: для A = 3 нет строки, которая имеет B = 3.

Структура имеет специальность, что каждое значение в A и B встречается только один раз, и в основном структура выглядит так: Каждыйзапись «указывает» на идентификатор другой записи, так что это в основном связанный список.

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

В данной демонстрационной таблице этот запрос должен вернуть запись с A = 3.

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

Если в таблице нет строки, запрос должен вернуть NULL.

Я уже пытался использовать SELECT … WHERE NOT IN, но это не работает со значениями NULL по желанию.Я также пытался SELECT … WHERE NOT EXISTS: у него нет проблемы NULL, но он очень медленный для больших таблиц.

Поэтому мой вопрос: есть ли эффективный способ найти строку, которую я ищуи если да, то как выглядит этот запрос?

PS: я не запрашиваю конкретную базу данных, поэтому в основном стандарт SQL в порядке.Если есть действительно хорошее решение для конкретной хорошо известной базы данных (такой как MariaDB, PostgreSQL, SQL Server,…), я также был бы заинтересован в конкретных решениях для них, но, вообще говоря, я ищу общий способрешить эту проблему.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы можете использовать NOT IN:

select
    a
  from my_table
  where a not in (select b from my_table)

Вы также можете использовать MINUS (Oracle):

select a from my_table
minus
select b from my_table
0 голосов
/ 11 октября 2018

Может быть, это?

SELECT
    x.*
FROM
    tbl AS x
    LEFT OUTER JOIN tbl AS y ON x.A = y.B
WHERE
    x.A IS NULL

"Эффективность" этого запроса зависит от того, какие индексы у вас есть в таблице, а не от самого запроса.Помните, что запросы SQL не сообщают СУБД , как выполнять работу.

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