2016-06-09 31 views
0

我已經寫了一個select查詢來從表(一對多)中獲取前1條記錄,該表對每個ID有多個記錄。例如,ID = 1,2和3 ..每個都有多行。該記錄有一個日期字段,因此我按該日期字段進行排序並在該日期之前獲取最新記錄。當我運行我的查詢時,我缺少ID 1和4的記錄。我檢查了這個表,並且這些2有多個記錄。我做了一個不同的計數,它返回了3000以上,我的查詢返回了1400。存在於表1中。奇怪的是,當我刪除Top 1時,我看到了所有的ID。查詢應該爲每個ID記錄第一條記錄,對嗎?訪問選擇Top 1沒有返回所有行

這裏是我的查詢

SELECT 
table2.RecentDate, 
table2.Name, 
table2.Address, 
table2.City, 
table2.State 

FROM [table1] 

INNER JOIN 
     ( SELECT Top 1 * 
      FROM [table2] 
      ORDER BY [table2].RecentDate DESC 

     ) table2 
ON [table1].[ID] = table2.[ID] 

任何幫助是極大的讚賞,

感謝。

+0

如果你做一個內部聯接,比它只會顯示其中兩個表1和表2的ID存在的結果。所以可能是表2中沒有這些ID的記錄。你也只能得到按日期排序的前1名,根本沒有考慮到ID .. – Mono

+1

你的內部查詢選擇**只有1條記錄**! TOP 1並不是每個組的前1名,它的TOP 1來自整個數據! – sagi

+0

這兩個表中存在的ID – John

回答

0
SELECT 
table2.RecentDate, 
table2.Name, 
table2.Address, 
table2.City, 
table2.State 

FROM [table2] 

INNER JOIN 
     ( SELECT [ID], MAX(RecentDate) dt 
      FROM [table2] 
      GROUP BY [ID]  
     ) t2 
ON [table2].[ID] = t2.[ID] and [table2].[RecentDate] = t2.[dt] 
+0

如果您沒有注意到,所有記錄來自table2,而不是table1。 – sagi

+0

謝謝我沒有注意到@sagi我改變了它,因爲我沒有看到使用表1 – scsimon

0

您可以從table2中獲取最大行來執行此操作。它應該比使用TOP更有效率,並返回你實際尋找的東西。

SELECT 
table2.RecentDate, 
table2.Name, 
table2.Address, 
table2.City, 
table2.State 
FROM [table1] T1 
INNER JOIN [table2] T2 
ON T1.[ID] = T2.[ID] 
AND T2.RECENT_DATE = (SELECT MAX(RECENT_DATE) FROM table2 T2E WHERE T2.ID=T2E.ID) 

如果你不需要table1的

select 
table2.RecentDate, 
table2.Name, 
table2.Address, 
table2.City, 
table2.State 
FROM [table2] T2 
WHERE T2.RECENT_DATE = (SELECT MAX(RECENT_DATE) FROM table2 T2E WHERE T2.ID=T2E.ID)