Сравнение двух таблиц - PullRequest
       1

Сравнение двух таблиц

1 голос
/ 21 января 2011

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

Подзапрос возвратил более 1 значения.

Ниже приведен мой запрос.

Select Table1.ID,
       Table1.Name
  From Table1
 Where Table1.ID not in ((select (Table2.ID)
                            from Table2 ) 
                         COLLATE SQL_Latin1_General_CP1_CS_AS)

Ответы [ 5 ]

6 голосов
/ 21 января 2011

Разве это не будет лот легче сделать:

SELECT Table1.ID,
       Table1.Name
FROM   Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE  Table2.ID is null
1 голос
/ 21 января 2011

Скобки и collate либо не нужны, либо не в том месте, но я не могу получить ту же ошибку, что и вы.

with Table1(ID, Name) aS
(
SELECT 'A1',2 union all
select 'B1',2
),
Table2(ID, Name) aS
(
SELECT 'A1',2 union all
select 'D1',2
)

Select Table1.ID,
       Table1.Name
  From Table1
 Where Table1.ID not in (select Table2.ID   COLLATE SQL_Latin1_General_CP1_CS_AS
                            from Table2 )

работает нормально.Вы должны отдать предпочтение NOT EXISTS над NOT IN для столбцов, допускающих значение NULL, но я предполагаю, что поле ID вряд ли будет NULLABLE?

0 голосов
/ 22 января 2011

Наиболее эффективный запрос для теста несуществования - это ... использовать NOT-существующие. Рабочий стол не должен собирать все строки LEFT JOIN только на PRUNE позже, используя предложение WHERE. Первое совпадение существования отменяет строку таблицы.

Select Table1.ID,
       Table1.Name
  From Table1
 Where NOT EXISTS (SELECT *
                   from Table2
                   WHERE Table2.ID = TABLE1.ID)
0 голосов
/ 21 января 2011

Эта часть ...

((select (Table2.ID) from Table2) COLLATE SQL_Latin1_General_CP1_CS_AS)

, кажется, собирает список строк ... Попробуйте удалить COLLATE SQL_Latin1_General_CP1_CS_AS

и просто используйте:

(select (Table2.ID) from Table2)  ) 
0 голосов
/ 21 января 2011

Оператор COLLATE применяется только к выражению, а не к набору.Вы уверены, что на самом деле нужно , чтобы указать сопоставление здесь?Если это так, вам нужно переместить его в подвыбор, чтобы он читался следующим образом:

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