SQL Server, несколько условий в коррелированных подзапросах - PullRequest
2 голосов
/ 17 апреля 2011

Я пытался использовать сложные условия в коррелированном подзапросе, но он не дал ожидаемого результата.Можете ли вы взглянуть на приведенный ниже пример, чтобы понять, почему первый запрос не работает, а второй работает?

Создать таблицу и заполнить строки:

CREATE TABLE TestCase
(
    Seq INT IDENTITY PRIMARY KEY,
    ID INT,
    Name VARCHAR(50)
)


INSERT INTO TestCase
VALUES
(100, 'MJ'),
(110, 'MJ'),
(120, 'AK'),
(130, 'AK')

Первый запрос:

SELECT A.ID, A.Name FROM TestCase AS A
WHERE A.ID IN (SELECT ID FROM TestCase WHERE ID <> A.ID AND Name = A.Name)

(затронуто 0 строк)

Второй запрос с EXISTS:

SELECT A.ID, A.Name FROM TestCase AS A
WHERE EXISTS (SELECT ID FROM TestCase WHERE ID <> A.ID AND Name = A.Name)

(затронуто 4 строк)

Предположительно, оба запроса должны возвращать все четыре строки, но первый запрос не дал;Я не уверен, почему только второй запрос вернул четыре строки.Может кто-нибудь помочь?Спасибо.

1 Ответ

2 голосов
/ 17 апреля 2011

Причина, по которой первый запрос возвращает 0 записей, заключается в том, что вы пытаетесь сопоставить идентификатор строки со строками, возвращенными подзапросом, A.ID IN (...), но подзапрос сопоставляется, чтобы исключить все идентификаторы, равные текущей записи (A.ID<>ID) , Таким образом, предложение WHERE IN всегда будет иметь значение false.

Второй запрос не пытается сопоставить возвращенные строки с A.ID, а только с тем, что существует строка с другим ID, но с тем же именем.

...