2014-11-06 69 views
0

行我有以下表結構:獲取與重複值

+----------+---------+ 
|  Trade  | 
+----------+---------+ 
| Trade_Id | Book_Id | 
+----------+---------+ 

+---------+-----------+ 
|  Book   | 
+---------+-----------+ 
| Book_Id | Book_Name | 
+---------+-----------+ 

+----------+--------------+---------------+ 
|     Keyword     | 
+----------+--------------+---------------+ 
| Trade_Id | Keyword_Name | Keyword_Value | 
+----------+--------------+---------------+ 

現在我想要從一個特定的書,有一個特定的重複關鍵字交易。我有一個查詢工作,但我討厭它,因爲我基本上重複where子句中的wohle查詢。

select 
    t.TRADE_ID, 
    kw.KEYWORD_VALUE 
from 
    trade t 
    inner join book b    on b.BOOK_ID = t.BOOK_ID 
             and b.BOOK_NAME = 'test123' 
    inner join TRADE_KEYWORD kw  on kw.TRADE_ID = t.TRADE_ID 
             and kw.KEYWORD_NAME = 'ISIN' 
where 
    kw.KEYWORD_VALUE in (
     select 
      kw2.KEYWORD_VALUE 
     from 
      trade t2 
      inner join book b2    on b2.BOOK_ID = t2.BOOK_ID 
               and b2.BOOK_NAME = 'test123' 
      inner join TRADE_KEYWORD kw2 on kw2.TRADE_ID = t2.TRADE_ID 
               and kw2.KEYWORD_NAME = 'ISIN' 
     group by kw2.KEYWORD_VALUE 
     having count (*) > 1) 

如何更優雅地做到這一點? 謝謝!

回答

1
select TRADE_ID, KEYWORD_VALUE from 
    (select 
     t.TRADE_ID, 
     kw.KEYWORD_VALUE, 
     count(kw.KEYWORD_VALUE) over(partition by kw.KEYWORD_VALUE) n 
    from 
     trade t 
     inner join book b    on b.BOOK_ID = t.BOOK_ID 
              and b.BOOK_NAME = 'test123' 
     inner join TRADE_KEYWORD kw  on kw.TRADE_ID = t.TRADE_ID 
              and kw.KEYWORD_NAME = 'ISIN' 
    )        
where n > 1; 

您可以使用分析功能。它們與集合函數類似,但是爲每行提供結果(PARTITION BY與GROUP BY類似)。

+0

不錯!謝謝,以前不知道分析功能。將在4分鐘內接受你的答案(仍然鎖定) – 2014-11-06 15:19:19