2014-03-24 54 views
0

需要SQL Server的一些幫助在這裏選擇查詢。SQL Server選擇從另一個表中獲取單個行

我有以下表中定義:

UserSource

UserSourceID ID Name Dept SourceID 
1   1 John AAAA 1 
2   1 John AAAA 2 
3   2 Nena BBBB 1 
4   2 Nena BBBB 2 
5   3 Gord AAAA 2 
6   3 Gord AAAA 1 
7   4 Stan CCCC 3 

來源

SourceID Description RankOrder 
1  FromHR  1 
2  FromTemp 2 
3  Others  3 

需要加入兩個表,並選擇只列在秩是最小的。使得得到的行將是:

UserSourceID ID Name Dept SourceID Description RankOrder 
1   1 John AAAA 1  FromHR  1 
3   2 Nena BBBB 1  FromHR  1 
6   3 Gord AAAA 1  FromHR  1 
7   4 Stan CCCC 3  Others  3 

TIA。

編輯:

這裏就是我來了這麼遠,但我似乎失去了一些東西:

WITH 
TableA AS(
SELECT 1 AS UserSourceID, 1 AS ID, 'John' AS [Name], 'AAAA' as [Dept], 1 as SourceID 
UNION SELECT 2, 1, 'John', 'AAAA', 2 
UNION SELECT 3, 2, 'Nena', 'BBBB', 1 
UNION SELECT 4, 2, 'Nena', 'BBBB', 2 
UNION SELECT 5, 3, 'Gord', 'AAAA', 2 
UNION SELECT 6, 3, 'Gord', 'AAAA', 1 
UNION SELECT 7, 4, 'Stan', 'DDDD', 3) 
, 
TableB AS(
SELECT 1 as SourceID, 'FromHR' as [Description], 1 as RankOrder 
UNION SELECT 2, 'FromTemp', 2 
UNION SELECT 3, 'Others', 3 
) 

SELECT DISTINCT tblA.*, tblB.SourceID, tblB.Description 
FROM TableB tblB 
JOIN TableA tblA ON tblA.SourceID = tblB.SourceID 
LEFT JOIN TableB b2 ON b2.SourceID = tblB.SourceID 
AND B2.RankOrder < tblB.RankOrder 
WHERE B2.SourceID IS NULL 

更新: 我掃描的表,可能有數據的一些變化。我已經更新了上述問題的數據。

實際上,我需要連接這兩個表,並且只能選擇RankOrder最少的那一行。在記錄UserSourceID = 7的情況下,該特定記錄將被選中,因爲在表被加入後只有一行存在。

+2

你能證明你已經取得了一些SQL嘗試任何項目? –

+0

排列順序'最小值'是否總是'1'?你可以放在'WHERE RankOrder = 1'。還有'MIN()'函數 - [請參閱此處](http://technet.microsoft.com/en-us/library/ms179916.aspx) –

回答

2

我經常使用這種類型的解決方案窗口聚合。 ROW_NUMBER將根據您在OVER子句中指定的PARTITIONORDER對行進行排序和編號。基於RankOrder

select UserSoruceID 
     , ID 
     , Name 
     , Dept 
     , SourceID 
     , Description 
     , RankOrder 
FROM (SELECT UserSoruceID 
       , ID 
       , Name 
       , Dept 
       , u.SourceID 
       , Description 
       , RankOrder 
       , ROW_NUMBER() over(PARTITION BY ID ORDER BY RankOrder) ranknum 
     FROM UserSource u 
     INNER JOIN 
       Source s 
       on s.SourceID = u.SourceID) a 
WHERE ranknum = 1 

因此,在這種情況下,對於每一個ID,數行,然後篩選其中,所以你只查看第一行。

這是一個有用的鏈接,從微軟的這個功能。 ROW_NUMBER

---- ---- UPDATE

這裏的以秩和行號作爲選項。

select UserSoruceID 
     , ID 
     , Name 
     , Dept 
     , SourceID 
     , Description 
     , RankOrder 
FROM (SELECT UserSoruceID 
       , ID 
       , Name 
       , Dept 
       , u.SourceID 
       , Description 
       , RankOrder 
       , ROW_NUMBER() over(PARTITION BY ID ORDER BY RankOrder) row_num 
       , RANK() over(PARTITION BY ID ORDER BY RankOrder) rank_num --use this if you want to see the duplicate records 
     FROM UserSource u 
     INNER JOIN 
       Source s 
       on s.SourceID = u.SourceID) a 
WHERE row_num = 1 --rank_num = 1 

替換rank_num ROW_NUM查看與重複RankOrder項

+0

您可能想要注意的是,如果「RankOrder '只有一個被選中。目前還不清楚數據和排名最小的要求*排名,如果這真的是OP的要求。它可能是'RANK()'。 –

+0

RankOrder將永遠是唯一的(在這種情況下,應該選擇至少一個)。我會檢查這個答案。 – Batuta

+0

[查看SQLFiddle](http://sqlfiddle.com/#!3/7e978d/10) –

相關問題