2013-04-16 66 views
4

我正在做兩個表之間的連接,並添加一個條件只想獲得滿足連接條件和「extern」條件的第一行。如何僅選擇滿足條件的第一行?

該查詢例如:

所有的
select * from PRMPROFILE p, user v 
where 
p.id = v.profile 
and p.language = 0 
and v.userid like '%TEST%'; 

首先,我想知道這種內在的結果如何組加入使用配置文件(v.profile或p.id)。之後,如何僅顯示每個組的第一次出現。

在此先感謝。

+0

你能展示一些樣本數據和預期結果嗎?而且你需要定義什麼使'特定'行匹配。 –

+1

你是什麼意思「extern」條件?您是否考慮過使用'和ROWNUM = 1'([請參閱Oracle文檔](http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm))?附錄:這將僅爲您提供1個匹配結果,但它可能在整個查詢中不一致。另請參見[ROWID](http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm)。 – wmorrison365

+0

「外部」條件是與連接條件不同的條件。連接不明確,並且在where子句中需要一些條件。 –

回答

6

您可以使用一個分析查詢此:

select * 
from (
    select p.*, v.*, 
     row_number() over (partition by p.id order by v.userid) as rn 
    from prmprofile p 
    join user v on v.profile = p.id 
    where p.language = 0 
    and v.userid like '%TEST%' 
) 
where rn = 1; 

內查詢獲取所有數據(但使用*並不理想),並添加了一個額外的列,用於指定跨e行號序列ach p.id值。他們必須按照某種東西來排序,而且你還沒有說什麼使某一行首先成爲'第一',所以我猜到了用戶ID - 當然,你可以將它改變爲更合適的東西,這樣可以得到一致的結果。查詢重新運行。 (您可以查看rankdense_rank以瞭解選擇「第一」行的替代方法)。

外部查詢只是將結果集限制爲額外列的值爲1的結果集,這會爲每個p.id提供一行。

另一種方法是使用子查詢來標識「第一」行並加入到該行中,但不清楚標準是什麼以及是否足夠有選擇性。

+0

不適用於我。拋出「列不明確定義」 –

+1

@JorgeVegaSánchez - 你的'profile'和'user'表有相同的名字列嗎?如果是這樣,你需要明確地列出它們,而不是使用'*',並且重複別名以使它們看起來有不同的名稱(假設你實際上想要同時檢索這兩個)。 –

+0

沒有具有相同名稱的列。我可以做沒有任何問題的加入:select * from prprrofile p 加入用戶v對v.profil = p.id 其中p.langue = 0 和v.userid類似'%TEST%'; –

0

這將只顯示頂部結果

select top 1 * from PRMPROFILE p, user v 
where 
    p.id = v.profile 
    and p.language = 0 
    and v.userid like '%TEST%'; 
+3

Oracle有這種語法嗎? – Thilo

+0

我很抱歉。我給了它的sql – user1613212

2

請嘗試:

select * from(
    select *, 
    row_number() over (partition by v.userid order by v.userid) RNum 
    from PRMPROFILE p, user v 
    where 
    p.id = v.profile 
    and p.language = 0 
    and v.userid like '%TEST%' 
)x 
where RNum=1; 
+0

但是不會將生成的連接表分組以僅顯示每個組的第一次出現。 –

+0

哪個是「組」列? – TechDo

+0

v.profil或p.id,用於連接展位表的列。 –

1

您可以使用LIMIT關鍵字。

select * from PRMPROFILE p, user v 
where 
p.id = v.profile 
and p.language = 0 
and v.userid like '%TEST%' 
limit 1 
+2

Oracle沒有'LIMIT'(直到12c,顯然)。它也不會解決問題的「分組」部分; OP希望每個配置文件ID有一行,而不是整個查詢的單個行。 –