2011-05-20 83 views
1

我想創建一個簡單的視圖,從2個數據庫獲取數據。幫助查詢,應該只返回最近的記錄

我有一個booking表,只顯示每個預訂一次,每個預訂記錄的日記表。

每個預訂多次表明了在日記表,但是我只希望最近在我看來

出於某種原因,這說明和預訂信息不工作

SELECT  
    t0.BOOKNO, t0.PARTY, t0.TOUR, t0.DEPART, t0.DEP7, t0.BOOK7, t0.PAID, t0.APRICE, t1.TEXT 
FROM   
    (SELECT DISTINCT 
     TOP (100) PERCENT 
     dbo.DIARY.ADDED, dbo.BOOKINGS.BOOKNO, dbo.BOOKINGS.PARTY, 
     dbo.BOOKINGS.TOUR, dbo.BOOKINGS.DEPART, 
     dbo.BOOKINGS.DEP7, dbo.BOOKINGS.BOOKED, dbo.BOOKINGS.BOOK7, dbo.BOOKINGS.PAID, 
     dbo.BOOKINGS.APRICE, dbo.BOOKINGS.STATUS 
    FROM   
     dbo.BOOKINGS 
    CROSS JOIN 
     dbo.DIARY 
    WHERE  
     (dbo.BOOKINGS.PAID IS NULL) 
     OR (dbo.BOOKINGS.PAID = 0) 
    GROUP BY 
     dbo.BOOKINGS.BOOKNO, dbo.BOOKINGS.PARTY, dbo.BOOKINGS.TOUR, dbo.BOOKINGS.DEPART, 
     dbo.BOOKINGS.DEP7, dbo.BOOKINGS.BOOKED, dbo.BOOKINGS.APRICE, dbo.BOOKINGS.STATUS, 
     dbo.BOOKINGS.BOOK7, dbo.BOOKINGS.PAID, dbo.DIARY.ADDED 
    HAVING  
     (dbo.BOOKINGS.STATUS <> 'xl') AND 
     (dbo.BOOKINGS.DEPART > CONVERT(int, GETDATE())) 
    ORDER BY 
     dbo.BOOKINGS.BOOKNO) AS t0 
INNER JOIN 
    (SELECT  
     BOOKNO, TEXT, MAX(ADDED) AS added 
    FROM   
     dbo.DIARY AS DIARY_1 
    GROUP BY BOOKNO, TEXT) AS t1 ON t0.BOOKNO = t1.BOOKNO 

我tryed這但它沒有工作無法解析查詢文本?

;WITH MostRecentBookings AS ( SELECT  dbo.DIARY.ADDED7, dbo.DIARY.ADDED, dbo.BOOKINGS.BOOKNO, dbo.BOOKINGS.PARTY, dbo.BOOKINGS.TOUR, dbo.BOOKINGS.DEPART, 
         dbo.BOOKINGS.DEP7, dbo.BOOKINGS.BOOKED, dbo.BOOKINGS.BOOK7, dbo.BOOKINGS.PAID, dbo.BOOKINGS.APRICE, dbo.BOOKINGS.STATUS, 
         dbo.DIARY.TEXT, ROW_NUMBER() OVER(PARTITION BY dbo.BOOKINGS.BOOKNO ORDER BY dbo.DIARY.ADDED DESC) AS 'RowNum' 
FROM   dbo.BOOKINGS INNER JOIN dbo.DIARY ON dbo.BOOKINGS.BOOKNO = dbo.DIARY.BOOKNO 
WHERE  (dbo.BOOKINGS.PAID IS NULL) OR  (dbo.BOOKINGS.PAID = 0)) 
SELECT * FROM MostRecentBookings 
WHERE RowNum = 1 
+0

你能解釋什麼不起作用嗎?它會給出錯誤嗎?或者返回什麼錯誤的數據? – Dan 2011-05-20 17:23:48

+0

文本列返回出於奇怪的原因,它應該只接受每行數1行,但由於某種原因多個來了 – 2011-05-20 17:25:08

回答

0

基本上,您可以使用CTE(公用表表達式)與ROW_NUMBER()函數結合來實現此目的。喜歡的東西:

;WITH MostRecentBookings AS 
(
    SELECT 
     (some columns), 
     ROW_NUMBER() OVER(PARTITION BY b.BOOK_NO ORDER BY d.ADDED DESC) AS 'RowNum' 
    FROM 
     dbo.Booking b 
    INNER JOIN 
     dbo.Diary d ON .......... 
) 
SELECT 
    (some columns) 
FROM 
    MostRecentBookings 
WHERE 
    RowNum = 1 

基本上,CTE會做兩個表之間的連接,它會再「分區」您的數據通過BOOK_NO - 這樣一來,每一個獨特的預訂獲取從1開始的行號。

編號是這樣的,最近的條目獲得數字1,前一個獲得後續更高的數字。從該CTE中,選擇RowNum = 1的條目作爲最近的預訂列表。

+0

我tryed複製你做了什麼,但它沒有工作,你可以看看 – 2011-05-20 17:37:44

+0

@ bugz:第一眼看起來確定 - 對不起,因爲我沒有你的桌子,也沒有看到你的屏幕,我真的不能說爲什麼它不會工作......嘗試減少數量列 - 從預訂中選擇一個,從日記中選擇一個,然後開始工作 - 然後再次添加更多列。另外:你可以發佈**確切的錯誤消息**你越來越?? – 2011-05-20 18:08:55

+0

他們ulitpart標識符不能綁定基本上我所有的列 – 2011-05-20 18:40:06