пожалуйста, помогите мне создать SQL-запрос - PullRequest
0 голосов
/ 23 января 2010

у меня есть следующие 3 таблицы

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 высокое)

Примечание: -приоритет содержит значение int, а значение max int будет рассматриваться как максимальный приоритет. если два dspartner имеют одинаковый приоритет, тогда получите любой из них

sql server 2005

1 Ответ

1 голос
/ 23 января 2010

Использование:

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 с таким же высоким приоритетом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...