2015-09-21 3 views
2

у меня есть вопрос:выберите UNION, кроме одного столбца

Я хочу присоединиться к двум querys SQL в одном запросе с помощью UNION, чтобы избежать дублирования, но мне нужно знать, если данные поступают из задатка запроса на выборку или из второй запрос выбора.

Образец данных:

A TABLE            B TABLE 
----------------------------------------------------------------------------- 
01 JOHN            01 JOHN 
02 JUAN            02 PETER 
03 MARTIN            03 MARTIN 

У меня есть что-то вроде этого:

Select A.code,A.name from A where some conditions 
unión 
Select B.code,B.name from B where diferent conditions 

РЕЗУЛЬТАТ ТАБЛИЦА


01 JOHN             
    02 JUAN 
    02 PETER 
    03 MARTIN 

Это прекрасно работает, но теперь, если я хочу знать если данные поступают из первого запроса или из конд я думаю, что-то вроде этого:

Select A.code,A.name, 'A' from A where some conditions 
unión 
Select B.code,B.name, 'B' from B where diferent conditions 

РЕЗУЛЬТАТ ТАБЛИЦА


01 JOHN 'A'            
    01 JOHN 'B' 
    02 JUAN 'A' 
    02 PETER 'B' 
    03 MARTIN 'A' 
    03 MARTIN 'B' 

Но не избежать "дубликатов", потому что 'A' является Diferent к 'B', так что вопрос, могу ли я сделать что-то, чтобы они не сравнивали «A» с «B»? - это еще один способ получить ожидаемый результат?

EDIT:

Ожидаемый результат


01 JOHN 'A'            
    02 JUAN 'A' 
    02 PETER 'B' 
    03 MARTIN 'A' 
+1

Что происходит, когда Джон в А и В? Это нормально, что запрос только говорит вам, что он находится в A? –

+0

Да, хорошо для меня, что это только в A, это то, что я ожидаю, я отредактировал, чтобы увидеть результат, которого ожидаю – Ion

+0

Тогда ответ jarlh должен сделать трюк. –

ответ

2

Вот еще один способ сделать это:

SELECT code, name, MIN(SourceTable) AS SourceTable 
FROM (
    SELECT code, name, 'A' AS SourceTable   
    FROM A 

    UNION 

    SELECT code, name, 'B' AS SourceTable   
    FROM B) t 
GROUP BY code, name 
ORDER BY code 

Demo here

или, возможно:

SELECT code, name, SourceTable 
FROM (
    SELECT code, name, SourceTable, 
     ROW_NUMBER() OVER (PARTITION BY code, name 
          ORDER BY SourceTable) AS rn 
    FROM (
    SELECT code, name, 'A' AS SourceTable   
    FROM A 

    UNION ALL 

    SELECT code, name, 'B' AS SourceTable   
    FROM B) t) AS x 
WHERE x.rn = 1 

Demo here

+0

Perfect !! !! это то, что мне нужно – Ion

1

Вы можете попробовать это:

Select A.code, A.name, 'A' col_name from A where some conditions 
UNION ALL 
Select B.code, B.name, 'B' from B where different conditions 

Союз будет удалить дубликаты, тогда как Union All не будет.

EDIT:

SELECT * 
FROM 
(
SELECT DISTINCT A.code, A.name From A WHERE some conditions 
UNION 
SELECT DISTINCT B.code, B.name From B WHERE different conditions 
) t 
+1

Разве это не противоположность того, что ему нужно? –

+0

@ MihaiOvidiuDrăgoi: - Я думаю, что OP хочет сохранить дубликаты, вот почему я предложил сделать это. См. Эту строку 'Но не избегайте дубликатов' –

+0

Я согласен с Mihai Ovidiu Drăgoi - Я думаю, что вопрос эквивалентен« как использовать только одну часть строки? » –

2
Select A.code, A.name, 'A' from A where some conditions 
union 
Select B.code, B.name, 'B' from B 
where different conditions 
    and not exists (select 1 from A 
        where some conditions 
        and A.code = B.code 
        and A.name = B.name) 

Проделайте UNION, как и раньше, но не возвращают B строки, которые уже были возвращены из A выберите.

+0

Спасибо, отлично работает для меня – Ion

+0

Я голосовал за @Giorgos Betsos как правильный ответ, потому что его лучшая производительность – Ion

+0

Нет проблем, я поддержал этот ответ! – jarlh