2012-06-25 105 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'次,那会更好。 –

相关问题