簡體   English   中英

需要SQL 2表奇數過濾器(Oracle)

[英]SQL 2 table odd filter required (Oracle)

我正在使用jpa,需要弄清楚我只需要2張桌子的奇怪過濾器。

描述:

查找具有唯一ID最小的rte,cd組合的行(這將是第1、4和6行)。 現在,將這些行與表2(fkey-pkey)結合在一起,以便對國家/地區進行過濾。 如果匹配,則以該不同的rte,cd組合返回表1中的所有行。

sqlfiddle: http ://sqlfiddle.com/#!9/bc932/7

        Table 1

id       rte      cd     fkey
---      ----     ---    ----
1        A         E      21
2        A         E      24
3        A         E      24
4        B         W      24
5        B         W      21
6        C         E      21
7        C         E      30


        Table 2

pkey    country
----    -------
 21       US
 24       MX
 30       CA

如果我過濾美國,結果將是:

id       rte      cd     fkey
---      ----     ---    ----
1        A         E      21
2        A         E      24
3        A         E      24
6        C         E      21
7        C         E      30
WITH a AS (SELECT rte, cd, max(fkey) keep (dense_rank first order by id asc) first_fkey
FROM   table_1
GROUP BY rte, cd )
SELECT 
FROM a INNER JOIN table_2 ON table_2.pkey = a.first_fkey
INNER JOIN table_1 on table_1.rte = a.rte and table_1.cd = a.cd
WHERE table_2.country = 'US'

語法沒有檢查錯別字,但是這個想法應該可行。 獲取每個rte / cd中具有最低ID的行的fkey。 然后,加入鄉村。 然后重新加入以獲取表1中的其余行。

備用版本-沒有WITH或DENSE_RANK

SELECT t1b.id, t1b.rte, t1b.cd, t1b.fkey
FROM table1 t1a,
     table2 t2,
     table1 t1b
WHERE t2.pkey = t1a.fkey
AND   t1b.rte = t1a.rte
and   t1b.cd = t1a.cd
and not exists ( SELECT 'x' FROM table1 t1c WHERE t1c.rte = t1a.rte and t1c.cd = t1a.cd and t1c.id < t1a.id )
and t2.country = 'US'

如果JPA甚至不支持NOT EXISTS ,請嘗試將查詢創建為數據庫視圖並將該視圖提供給JPA。

另外,WITH / DENSE_RANK版本將運行得更快,因此如果您使用視圖路徑,則可以使用該版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM