как правильно составить, чтобы получить разницу из двух таблиц - PullRequest
1 голос
/ 27 января 2010

привет, я использую SQL Server 2008, хочу создать представление для отображения различий между двумя таблицами.

например

t1
id    name
----  ------
1      John
2      peter
3      mary
4      joe
5      sun

t2
id    name
---   ----
1      john
2      joe

как создать представление для отображения всех имен в t1, но не в t2.

Я пытался сделать это, и всегда получаю Msgstr "Преобразование не удалось при преобразовании из символьной строки в uniqueidentifier." Ошибка

а также я не хочу использовать выберите что-то не в {что-то}, это медленно

так есть ли способ использовать join ??

Ответы [ 3 ]

4 голосов
/ 27 января 2010

НЕ В


SELECT t1.name
  FROM TABLE_1 t1
 WHERE t1.name NOT IN (SELECT t2.name
                         FROM TABLE_2 t2)

НЕ СУЩЕСТВУЕТ


SELECT t1.name
  FROM TABLE_1 t1
 WHERE NOT EXISTS (SELECT NULL
                     FROM TABLE_2 t2
                    WHERE t2.name = t1.name)

LEFT JOIN / IS NULL:


   SELECT t1.name
     FROM TABLE_1 t1
LEFT JOIN TABLE_2 t2 ON t2.name = t1.name
    WHERE t2.name IS NULL

Краткое описание


Вопреки вашему убеждению, NOT IN будет эквивалентен NOT EXISTS. LEFT JOIN/IS NULL является наименее эффективным из трех вариантов.

0 голосов
/ 24 апреля 2012
    SELECT name  FROM TABLE_1
     EXCEPT
    SELECT name  FROM TABLE_2
0 голосов
/ 27 января 2010

Вот трюк, который я использую:

SELECT  MAX(TABLE_NAME) AS TABLE_NAME
       ,[id]
       ,[name]
FROM    (
         SELECT 'T1' AS TABLE_NAME
               ,[id]
               ,[name]
         FROM   T1
         UNION ALL
         SELECT 'T2' AS TABLE_NAME
               ,[id]
               ,[name]
         FROM   T2
        ) AS X
GROUP BY [id]
       ,[name]
HAVING  COUNT(*) = 1
ORDER BY [id]
       ,[name]

На самом деле у меня есть универсальный процесс, который я использую, который берет две таблицы и набор параметров и сравнивает таблицы, генерирующие динамический SQL (приведенный выше SQL фактически очищен от его сгенерированного кода), он использует либо UNION ALL трюк или комбинация трех объединений в ответе OMG Ponies в зависимости от того, указаны ли ключевые столбцы / игнорируемые столбцы / общие столбцы.

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