2015-06-22 53 views
1

当我运行针对SQL Server数据库的SQL语句:TSQL返回基于列的首选值不同的行

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 

基本上我试图解决的问题是,当有多个状态和赞成的状态主动删除的行删除重复的行,我真的试图避免嵌套查询,或者如果可能的相交。

+1

什么是最佳状态?你能否提供't1'和't2'的样本数据。 –

+0

你的连接条件是't1.id = t2.id'。两张表都有相同的ID字段吗?或者你的意思是't1.statusid = t2.id' – ughai

+0

如果'Active'和'Draft'都存在,首选的状态是'Active'。 – ImaginateWayne

回答

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 
+0

您可以删除'WHERE t1.id = t2.id',因为这也恰好是'JOIN'条件。 –

+0

@wewesthemenace - true。即使'JOIN'条件看起来有点不可思议't1.id = t2.id' – ughai

+0

感谢@ughai,这是一种享受,是我进入超越基本CRUD操作的更大世界的第一步。 我现在可以将CTE和ROW_NUMBER()添加到我的TSQL工具带中! – ImaginateWayne