如何为这种情况编写sql?

时间:2013-08-19 19:20:49

标签: sql sql-server tsql sql-server-2008-r2

假设我有一个表(关系),如

MyTab(ID1,ID2,IsMarked, data,....)

示例数据可能如下所示:

1,  1, 1, ...
1,  2, 0, ...
1,  3, 0, ...

2,  34, 1, ...

3,  4, 0, ...

4,  546, 0, ...
4,  8, 0, ...

每个ID1只能标记一个。我想为所有实体1获取标记为ID1的数据。如果没有标记记录,请获取第一个或其中任何一个。

对于上述样本数据,结果应为:

1,  1, 1, ...

2,  34, 1, ...

3,  4, 0, ...

4,  546, 0, ...

Union可能是一个解决方案,但是太长并且可能性能不佳。 我的想法是按ID1IsMarked desc对数据进行排序,得到每个ID1的前1个,但是如何为这种情况编写SQL

2 个答案:

答案 0 :(得分:3)

对于每个ID1 只能标记一个,以下内容应该有效:

;with cte as (
    select *, rn=row_number() over (partition by ID1 order by IsMarked desc)
)
select *
from cte
where rn=1

答案 1 :(得分:0)

在黑暗中拍摄:

SELECT A.*
FROM MYTAB A
    LEFT JOIN (
        SELECT MAX(ID2) AS MAXID2, ID1
            FROM MYTAB
                WHERE ISMARKED=1
                    GROUP BY ID1
    ) B ON A.ID2=B.MAXID2 AND A.ID1=B.ID1
        LEFT JOIN (
            SELECT MAX(ID2) AS MAXID2, ID1
                FROM MYTAB
                    WHERE ISMARKED=0
                        GROUP BY ID1
        ) C ON A.ID2=C.MAXID2 AND A.ID1=C.ID1
            WHERE
                (B.ID1 IS NOT NULL)
                OR
                (B.ID1 IS NULL AND C.ID1 IS NOT NULL);