1

我有以下 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 之后)。

4

4 回答 4

3

对此类查询使用 Oracle 分析函数

    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
于 2012-06-25T19:55:06.700 回答
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%'     
           )

如果您要关闭另一个字段,例如 OrderDate 等,请更改子查询。无论哪种方式,外部查询都只会从内部查询中选择的 ID 中选择记录。

于 2012-06-25T19:39:31.937 回答
0

使用不同的:

SELECT DISTINCT ID, NAME FROM myTable
WHERE 
ID LIKE 'R43%' OR 
ID LIKE 'D32%' OR 
ID LIKE 'F22%'
于 2012-06-25T19:40:43.900 回答
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
)
于 2012-06-25T19:53:39.133 回答