当我针对SQL Server数据库运行以下SQL时:
SELECT
t1.id, t1.name, t2.status
FROM
t1
JOIN
t2 ON t1.id = t2.id
WHERE
t1.id = t2.id
我得到以下结果
id name status
-------------------
1 bob active
1 bob draft
2 jim active
3 ted draft
我试图找出如何构造WHERE
语句以获得以下所需结果。
id name status
-------------------
1 bob active
2 jim active
3 ted draft
基本上我试图解决的问题是当有多个状态时删除重复行并删除行以支持状态活动,我真的试图避免嵌套查询或交叉(如果可能)。
答案 0 :(得分:6)
将ROW_NUMBER()
与CASE
一样使用
;WITH CTE AS
(
SELECT t1.id, t1.name, t2.status,ROW_NUMBER()OVER(PARTITION BY t1.id ORDER BY CASE WHEN t2.status = 'active' THEN 1 ELSE 2 END ASC) rn
FROM t1 JOIN t2 ON t1.id = t2.id
)
SELECT * FROM CTE WHERE rn = 1