2012-06-25 106 views
1

我有以下SQL語句:SQL獲得第一個匹配的結果

SELECT ID, NAME FROM myTable 
WHERE 
ID LIKE 'R43%' OR 
ID LIKE 'D32%' OR 
ID LIKE 'F22%' 

和ID可能有值,如:

ID 
____ 

R431 
R431 
R432 
R434 
D322 
D322 
D327 
F226 
F227 

如何將我只得到了第一個ID記錄相匹配?就像上面的值一樣,我只會得到(R431,R431,D322,D322,F226)的記錄。我抓取的表中的ID值是連續的(所以R432將始終出現在表格中的R431之後)。

+0

變化的使用Oracle分析功能'where'條款。 – 2012-06-25 19:38:54

+0

第一個ID匹配是什麼意思? –

+0

NAME是否與該ID綁定,因此所有ID爲R431的記錄都會具有相同的NAME?這是一個微妙的差異,但在訂購和過濾時很重要。我認爲答案在於使用MAX和Group By來獲取正確的字段,但沒有關於表格中確切架構的更多信息,很難猜測要將group.order定義爲什麼。在你有限的樣本中,DISTINCT可以工作,但我不認爲這就是你要求的。 – David

回答

3

這些類型的查詢

select * from (
select id , substr(id,0,3),rank() over (partition by substr(id,0,3) order by id) rank 
from mytable 
WHERE ID LIKE 'R43%' OR ID LIKE 'D32%' OR ID LIKE 'F22%') 
where rank = 1 
+0

我會chnage到'PARTITION BY ID'。砍到3個字符是任意的。如果有'R431156'編號? –

+0

我使用substr,因爲OP只使用前3個字符來匹配where子句。 –

+0

謝謝,完美無缺! – user1384831

0

MIN查詢和嵌套子查詢的組合應該可以得到你想要的結果。

Select ID, 
     Name 
FROM myTable 
WHERE 
    ID IN ( 
     SELECT MIN(ID) From myTable WHERE ID LIKE 'R43%' OR ID LIKE 'D32%' OR ID LIKE 'F22%'  
      ) 

如果有你想要鍵關機,像訂購日期等其他領域,改變子查詢。無論哪種方式,外部查詢只會從內部查詢中選擇的ID中選擇記錄。

+0

我不認爲這樣做他在這裏描述的是:「就像上面的值一樣,我只會得到(R431,R431,D322,D322,F226)的記錄。」 –

+0

根據以上意見編輯。 – David

0

使用DISTINCT:

SELECT DISTINCT ID, NAME FROM myTable 
WHERE 
ID LIKE 'R43%' OR 
ID LIKE 'D32%' OR 
ID LIKE 'F22%' 
+0

我不認爲這是他在這裏描述的:「就像上面的值一樣,我只會得到(R431,R431,D322,D322,F226)的記錄。」 –

+0

這是基於我對他的要求的解釋。我可能誤讀了。 – Kermit

0

嘗試使用子查詢:

SELECT R.ID AS ID, R.NAME AS NAME FROM myTable R 
WHERE 
R.ID LIKE 'R43%' 
AND R.ID IN 
(
    SELECT DISTINCT A.ID 
FROM myTable A 
WHERE A.ID LIKE 'R43%' 
ORDER BY A.ID 
LIMIT 1 
) 

UNION 

SELECT D.ID AS ID, D.NAME AS NAME FROM myTable D 
WHERE 
D.ID LIKE 'D32%' 
AND D.ID IN 
(
    SELECT DISTINCT B.ID 
FROM myTable B 
WHERE B.ID LIKE 'D32%' 
ORDER BY B.ID 
LIMIT 1 
) 

UNION 

SELECT F.ID AS ID, F.NAME AS NAME FROM myTable F 
WHERE 
F.ID LIKE 'F22%' 
AND F.ID IN 
(
    SELECT DISTINCT C.ID 
FROM myTable C 
WHERE C.ID LIKE 'F22%' 
ORDER BY C.ID 
LIMIT 1 
) 
+1

不帶ORDER BY的LIMIT返回任意行。我認爲他想要「第一」行,我認爲它是a)插入表中的行第一個b)具有最小編號的行或c)首先以詞典順序出現的行(OP遺憾的是沒有指定他想要的這三個選項中的哪一個)。另外,如果你不需要複製大量的代碼'n'次,那會更好。 –

相關問題