请帮助我创建sql查询

请帮助我创建sql查询,sql,sql-server,Sql,Sql Server,我有以下三张桌子 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,

我有以下三张桌子

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表,以便设置hotels.dspartner=hotelsourcemap.dspartnerid 哪里 hotels.hotelid=hotelsourcemap.hotelid 和hotelsourcemap.dspartnerid=dspartner.dspartnerid,其中dspartnerid的优先级较高


注意:-优先级包含int值,最大int值将被视为最大优先级。如果两个dspartner具有相同的优先级,则获取其中任何一个

sql server 2005使用:

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
更换?你可以选择任何一家酒店。
它将只返回一个dspartnerid值,即使有多个dspartnerid具有相同的高优先级

如果有两个或多个dspartnerid具有相同的高优先级,该怎么办?高优先级是什么?数据类型是int,但这并不意味着更高的数字意味着更高的排名。据我们所知,优先级包含int值,而max int值将被视为max priority。如果两个dspartner具有相同的优先级,则获取其中任何一个以及SQL Server的哪个版本?获取此错误:子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。在我们加入Hotels.hotelid=Hotelsourcemap.hotelid?????的查询中没有意义-您是否忘记了where x.rank=1?我认为应该是这样的,但仍然错误:从选择x.dspartnerid更新Hotels SET dspartnerid=a.dspartnerid,hsm.hotelid从中选择hsm.dspartnerid,hsm.hotelid行号按hsm.hotelid顺序按p.priority超额分配,p.name描述为HOTELSOURCEMAP hsm中的排名在p.dspartnerid=hsm.dspartnerid x上加入DSPARTNER,其中x.rank=1作为a,其中a.hotelid=hotels.hotelid未从选择中设置dspartnerid=a.dspartnerid…-这是无效的语法。