2015-05-14 2 views
1

Предположим у меня есть данные, как это в таблице:Условный Само Присоединяется

Trade Id | Source 
----------------- 
x  | LCH  
x  | Commodore 
y  | LCH   
z  | Commodore 

Я хотел бы вывод, как это:

x | LCH   
y | LCH   
z | Commodore 

Значение, если есть запись «LCH» для данного торговый идентификатор, который будет иметь приоритет.

Я мог бы сделать это легко на Java или любом другом языке программирования, получив основные результаты после присоединения к таблицам, а затем отфильтровать его с помощью карты и т. Д., Но из-за причин производительности мы хотели бы сделать это, используя запрос на первое место.

Не могли бы вы взглянуть и сообщить мне, есть ли какое-либо решение в SQL.

+1

Какой вкус СУБД вы используете? –

+1

Есть ли только два значения 'LCH' и' Commodore'? если нет, то можете ли вы, пожалуйста, обновить свои данные образца и ожидаемый результат с ним ... --- Вы хотите, чтобы одна строка для каждого 'Trade_id' и соответствующий' source' будет следовать вашему правилу? ИЛИ --- хотите ли исключить эти строки из набора результатов, для которого существует запись с 'LCH'? –

+0

@MaheswaranRavisankar its DB2 –

ответ

1

Мы должны следовать логике Divide and Conquer. первый дисплей

Давайте все trade_id «s с source = 'LCH'

SELECT Trade_id,Source 
FROM your_table 
WHERE Source='LCH' 

Теперь мы должны тянуть другие trade_id о том, что не имеют LCH источник! Здесь я использую NOT EXISTS.

SELECT Trade_id,Source 
FROM your_table a 
WHERE NOT EXISTS 
(SELECT 'X' FROM your_table b 
    WHERE a.Trade_id = b.Trade_id 
    AND b.Source = 'LCH') 

Теперь, когда мы добыли все строки, которые мы хотели, поэтому мы делаем UNION (операция Set) обоих ResultSets.

SELECT Trade_id,Source 
FROM your_table 
WHERE Source='LCH' 
UNION ALL 
SELECT Trade_id,Source 
FROM your_table a 
WHERE NOT EXISTS 
(SELECT 'X' FROM your_table b 
    WHERE a.Trade_id = b.Trade_id 
    AND b.Source = 'LCH') 
+0

Избегайте ответов только на код. Добавьте описание своего решения. – ughai

+0

Этот SQL является самоописательным. И при добавлении описания в SQL потребуется много текста. Вы можете широко увидеть так много ответов, как это! И вы также можете увидеть мою историю ответов для любых сообщений, основанных на описании ... –

+0

Из [Meta] (http://meta.stackexchange.com/questions/148272/is-there-any-benefit-to-allowing-code- only-answers-while-blocking-code-only-ques). Хотя ответ только на код дает человеку, который задал вопрос, какой бы препятствие они ни встречали, он не делает их или будущих посетителей много хорошего в длинных запустить. Мы всегда говорили, что мы не фабрика кода. Мы - люди, которые учат других ловить рыбу. Только для кода только кормить человека на день. – ughai

0

попробовать это:

select * from table where source = 'LCH' 
Union 
select * from table where source <> 'LCH' and trade_id not in (select * from table where source = 'LCH' 
) 
1

Это задача для функции оконного агрегатный, нет необходимости объединения:

SELECT Trade_id, Source 
FROM 
(
    SELECT Trade_id, Source, 
     ROW_NUMBER() 
     OVER (PARTITION BY Trade_id 
      ODER BY CASE WHEN Source = 'LCH' THEN 0 ELSE 1 END) AS rn 
    FROM your_table 
) AS dt 
WHERE rn = 1 
0
SELECT [Trade Id],Source 
FROM table1 
WHERE Source = 'LCH' 
Union 
SELECT [Trade Id],Source 
FROM table1 
WHERE Source<> 'LCH' 
AND [Trade Id] NOT IN (SELECT [Trade Id] FROM table1 WHERE Source= 'LCH') 
Смежные вопросы