2010-01-23 80 views
0

我有以下3個表請幫我創建一個SQL查詢

CREATE TABLE [dbo].[dspartner](
[dspartnerid] [bigint] IDENTITY(1,1) NOT NULL, 
[name] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
[priority] [int] NULL) 

CREATE TABLE [dbo].[hotels](
[hotelid] [int] PRIMARY KEY IDENTITY(1,1) NOT NULL, 
[name] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
[DSPartnerid] [bigint] NULL, 
) 

CREATE TABLE [HotelSourceMap](
[hotelsourcemapid] [bigint] PRIMARY KEY IDENTITY(1,1) NOT NULL, 
[dspartnerid] [bigint] NOT NULL, 
[hotelid] [bigint] NOT NULL, 
    [dshotelid] bigint 
) 

的情況是這樣的:

我想表:dspartner包含有關數據源合作伙伴詳情。 表:酒店包含酒店的詳細信息 表:HotelSourceMap包含hotels.hotelid的紀錄,dsparnter.dspartnerid

新我想更新酒店表,以便集hotels.dspartner = hotelsourcemap.dspartnerid 其中 hotels.hotelid = hotelsourcemap.hotelid 和hotelsourcemap.dspartnerid = dspartner.dspartnerid(其中dspartnerid的priorirty高)

注:-priority包含int值和最大int值將作爲considerd最高優先級。如果兩個dspartner具有相同的優先級,然後讓他們中的任何一個

SQL Server 2005中

+0

如果有兩個(或更多)'dspartnerid'具有相同的高優先級?什麼是「高優先級」 - 數據類型是int,但這並不意味着更高的數字意味着更高的排名 - 對於我們所知的所有數據可能是相反的。 – 2010-01-23 05:18:11

+0

優先級包含整型值,最大整型值將被視爲最大優先級。 如果兩個dspartner具有相同的優先級,那麼得到它們中的任何一個 – 2010-01-23 05:23:12

+0

和哪個版本的SQL Server? – 2010-01-23 05:25:53

回答

1

用途:

UPDATE HOTELS 
    SET dspartners = (SELECT x.dspartnerid 
         FROM (SELECT hsm.dspartnerid, 
            ROW_NUMBER() OVER(PARTITION BY hsm.hotelid 
                 ORDER BY p.priority, p.name DESC) AS rank 
           FROM HOTELSOURCEMAP hsm 
           JOIN DSPARTNER p ON p.dspartnerid = hsm.dspartnerid 
           WHERE hsm.hotelid = hotelid) x 
         WHERE x.rank = 1) 

,以確保一切工作正常,運行:

SELECT x.dspartnerid 
    FROM (SELECT hsm.dspartnerid, 
       ROW_NUMBER() OVER(PARTITION BY hsm.hotelid 
           ORDER BY p.priority, p.name DESC) AS rank 
      FROM HOTELSOURCEMAP hsm 
      JOIN DSPARTNER p ON p.dspartnerid = hsm.dspartnerid 
     WHERE hsm.hotelid = ?) x 
WHERE x.rank = 1 

更換?與任何您選擇的hotelid。
即使存在多個具有相同高優先級的dspartnerid,它也只會返回一個dspartnerid值。

+0

得到這個錯誤: 子查詢返回的值超過1。當子查詢遵循=,!=,<, <= , >,> =或當子查詢用作表達式時,這是不允許的。 – 2010-01-23 05:35:12

+0

並在查詢我們加入Hotels.hotelid = Hotelsourcemap.hotelid ????? – 2010-01-23 05:37:08

+0

沒有意義 - 你忘記了WHERE x.rank = 1嗎? – 2010-01-23 05:37:30