2015-06-22 62 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