2011-01-21 5 views
1

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

Subquery returned more than 1 value.

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

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

Где должен применяться сопоставление - не нужно менять его при сравнении идентификатора, который считается числовым. –

ответ

0

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

select Table2.ID COLLATE SQL_Latin1_General_CP1_CS_AS from Table2 
6

бы не стать много легче сделать:

SELECT Table1.ID, 
     Table1.Name 
FROM Table1 
LEFT JOIN Table2 ON Table1.ID = Table2.ID 
WHERE Table2.ID is null 
+0

Я не уверен, что я бы сказал, что это будет ** много ** (не совсем уверен, что я бы сказал, что это легко), но так я бы написал этот запрос. –

+0

Я использую 'НЕ EXISTS' для этих http://sqlinthewild.co.za/index.php/2010/03/23/left-outer-join-vs-not-exists/ –

+0

@Martin И я узнаю все новые повседневные - не понимали, что они будут работать по-разному с правильными индексами. –

0

Эта часть ...

((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

Если вы отправляете код, образцы XML или данных **, пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ({}) на панели инструментов редактора, чтобы красиво форматировать и синтаксис выделить его! –

1

Скобки и 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 на столбцах с нулевым значением, но я предполагаю, что поле ID вряд ли будет NULLABLE?

+2

Я уверен, что вы никогда не сможете получить «Подзапрос вернул более 1 значения». с 'Не в' OP, вероятно, в какой-то момент имел' <> 'или' = '. –

0

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

Select Table1.ID, 
     Table1.Name 
    From Table1 
Where NOT EXISTS (SELECT * 
        from Table2 
        WHERE Table2.ID = TABLE1.ID) 
Смежные вопросы