为多行选择一行数据

时间:2018-06-07 14:44:35

标签: sql sql-server select

我目前正在使用Sql server 2016

我有那个例子:

 ID / TYPE / VALUE
 001 / 10  / EAN13
 001 / 10  / EAN8
 002 / 10  / EAN128
 002 / 10  / EAN13
 003 / 10  / EAN8
 004 / 10  / EAN13

我想要这个:

 ID / TYPE / VALUE
 001 / 10  / EAN13
 002 / 10  / EAN13
 003 / 10  / EAN8
 004 / 10  / EAN13

我目前的要求是:

SELECT ID.a,TYPE.a,VALUE.a FROM TABLE.a , TABLE.b 
WHERE ID.a = ID.b  and TYPE.a = TYPE.b AND VALUE = 'EAN13' or VALUE LIKE 'EAN%'

我看到一个选项,只为每个ID选择我想要的行: 使用订单并且仅显示带有ROW.NUMBER的第一行,但它似乎也不起作用。 请问你能帮帮我吗 ? :)

2 个答案:

答案 0 :(得分:0)

从不FROM子句中使用逗号。 始终使用正确的,明确的JOIN语法。如果你这样做,你的问题可能会消失。您还需要修复限定列名称:

SELECT a.ID, a.TYPE, a.VALUE
FROM TABLE.a a JOIN
     TABLE.b b
     ON a.ID = b.ID  AND a.TYPE = TYPE 
WHERE VALUE = 'EAN13' or VALUE LIKE 'EAN%';

当然,这两个LIKE表达式是多余的,因此您可以删除第一个:

SELECT a.ID, a.TYPE, a.VALUE
FROM TABLE.a a JOIN
     TABLE.b b
     ON a.ID = b.ID  AND a.TYPE = TYPE 
WHERE a.VALUE LIKE 'EAN%';

答案 1 :(得分:0)

试试这个:

; with 
cte     as (
SELECT  t.*
        ,  ROW_NUMBER() over (partition by t.id order by SUBSTRING(t.value, 5, 1) desc) as RN
FROM    table t
)
select  cte.id  
        , cte.type
        , cte.value
from    cte 
where   RN = 1