2010-01-23 4 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 (где priorirty dspartnerid высок)

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

SQL Server 2005

+0

Что делать, если есть два (или более) 'dspartnerid' с равными высокими приоритетами? И что такое «высокий приоритет» - тип данных - int, но это не означает, что более высокие цифры означают более высокий ранг - может быть обратным для всех, что мы знаем. –

+0

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

+0

А какая версия SQL Server? –

ответ

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 значения. Это недопустимо, когда подзапрос следует =,! =, <, <= , >,> = или когда подзапрос используется как выражение. –

+0

и в запросе, где мы присоединяемся к Hotels.hotelid = Hotelsourcemap.hotelid ????? –

+0

Не имеет смысла - вы забыли 'WHERE x.rank = 1'? –

Смежные вопросы