2016-11-23 4 views
0

Как я могу вернуть только разные столбцы при использовании, кроме SQL Server.Возвращаемые столбцы, за исключением SQL Server

Пример:

SELECT ID, NAME FROM TABLE_B 
EXCEPT 
SELECT ID, NAME FROM TABLE_A 

В этом случае, если есть другое возвращение имени просто показать столбец имен.

+6

вы можете предоставить некоторые выборочные данные и желаемый результат, как я не в полной мере понять, что вы спрашиваете? – Tanner

+0

Возможно, посмотрите [этот ответ] (http://stackoverflow.com/a/2077929/5809511). –

+0

Являются ли ИДЫ, ИМЯ NULL? – Serg

ответ

0

Ваш код верный. Вы не получите повторяющуюся строку (это ID + NAME!).

Но если я правильно понимаю, вы хотите сосредоточиться только на именах. Затем удалите ID из выбранных полей:

SELECT NAME FROM TABLE_B 
EXCEPT 
SELECT NAME FROM TABLE_A 

[отредактирован, что касается комментария:]

Это показывает различные строки из TABLE_B, которые не TABLE_A. Это цель использования EXCEPT. Для чего бы то ни было, EXCEPT не является решением.

В случае, если вы ищете для всех Diferent имен из обеих таблиц, вы можете использовать:

select distinct NAME 
from 
    (select NAME from TABLE_A 
    UNION 
    select NAME from TABLE_B) as T 
+0

С вашим решением вы получаете только имена из 'TABLE_B', которые не находятся в' TABLE_A'. Как насчет имен, которые находятся только в 'TABLE_A'? –

+0

@diiN_ вы правы. Он показывает различные строки из TABLE_B, которые не указаны в TABLE_A. Это цель использования EXCEPT. Для чего бы то ни было, EXCEPT не является решением. Что касается вашего комментария ... @ diiN_, возможно, вы ищете что-то вроде «SELECT different NAME» от (выберите NAME из TABLE_A UNION, выберите NAME из TABLE_B), как T '..., который получит все разные имена из обеих таблиц. – MarcM

0

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

ID flag_ID NAME flag_Name 
1 !  A  !     -- No Id=1, no NAME ='A' exists in the second table 
3 NULL NULL !     -- Id=3 exists, no NAME is NULL exists 
4 NULL Y  NULL    -- Both values exist but never in the same row 

и приступайте к критериям, которые вам нужны.

Предполагая, что ID не NULL, NAME обнуляемым, значения NULL следует рассматривать как «равный»:

SELECT b.ID, 
     CASE WHEN NOT EXISTS (SELECT 1 FROM a t2 WHERE t2.ID=b.ID) THEN '!' END flag_ID, 
     b.NAME, 
     CASE WHEN NOT EXISTS (SELECT 1 FROM a t2 
          WHERE ISNULL(NULLIF(b.NAME, t2.NAME), NULLIF(t2.NAME, b.NAME)) IS NULL) 
          THEN '!' END flag_Name 
FROM b 
LEFT JOIN a ON a.ID = b.ID 
    AND ISNULL(NULLIF(a.NAME, b.NAME), NULLIF(b.NAME, a.NAME)) IS NULL 
WHERE a.ID IS NULL 
    OR ISNULL(NULLIF(a.NAME, b.NAME), NULLIF(b.NAME, a.NAME)) IS NOT NULL