有条件的自我联接

时间:2015-05-14 06:38:24

标签: sql db2 self-join

假设我在表格中有这样的数据:

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

我想要这样的输出:

x | LCH           
y | LCH           
z | Commodore

意思是否有任何" LCH"对于给定的交易ID的输入,这将是优先权。

我可以通过在加入表格后获取基本结果然后使用地图等过滤来轻松地在Java或任何其他编程语言中完成此操作但由于性能原因,我们希望在第一次使用查询时执行此操作的地方。

请您查看一下,如果SQL中有任何解决方案,请告诉我。

4 个答案:

答案 0 :(得分:1)

我们必须遵循分而治之的逻辑。

让我们先使用trade_id显示所有source = 'LCH'

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

现在,我们必须提取其他没有LCH来源的trade_id!我在这里使用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(设置操作)。

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')

答案 1 :(得分: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

答案 2 :(得分: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'
)

答案 3 :(得分: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')