2010-01-23 86 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