Оператор вложенного SQL Select не работает на SQL Server 2000, нормально на SQL Server 2005

Вот запрос:

INSERT INTO @TempTable
   SELECT 
      UserID, Name,
      Address1 = 
        (SELECT TOP 1 [Address] FROM
           (SELECT TOP 1 [Address] FROM [UserAddress] ua 
            INNER JOIN UserAddressOrder uo ON ua.UserID = uo.UserID 
            WHERE ua.UserID = u.UserID
            ORDER BY uo.AddressOrder ASC) q 
          ORDER BY AddressOrder DESC),
      Address2 = 
         (SELECT TOP 1 [Address] FROM
             (SELECT TOP 2 [Address] FROM [UserAddress] ua 
              INNER JOIN UserAddressOrder uo ON ua.UserID = uo.UserID 
              WHERE ua.UserID = u.UserID
              ORDER BY uo.AddressOrder ASC) q 
           ORDER BY AddressOrder DESC)
      FROM 
         User u

В этом сценарии у пользователей есть несколько определений адресов, причем целочисленное поле указывает предпочтительный порядок. «Адрес2» (второй предпочтительный адрес) пытается взять два верхних предпочтительных адреса, упорядочить их по убыванию, а затем выбрать верхний из результата. Вы можете сказать, что просто используйте подзапрос, который выполняет SELECT для записи со значением «2» в поле «Порядок», но значения порядка не являются смежными.

Как это можно переписать, чтобы соответствовать ограничениям SQL 2000?

Очень ценю.

[ИЗМЕНИТЬ]

Когда я заменяю u.UserID в предложении WHERE фактическим идентификатором пользователя, SQL Server 2000 не жалуется. Кажется, что SQL 2000 не может связать внутреннюю ссылку (u.UserID) с внешней таблицей (User u).

Опять вылетает ошибка:

Msg 8624, Level 16, State 16, Line 24
Internal SQL Server error.

person Jay    schedule 13.05.2010    source источник
comment
Какую ошибку вы получаете с SQL 2000?   -  person SqlACID    schedule 13.05.2010
comment
Ошибка: Msg 8624, уровень 16, состояние 16, строка 24 Внутренняя ошибка SQL Server.   -  person Jay    schedule 13.05.2010


Ответы (1)


Поскольку проблема возникла из-за невозможности разрешить внутреннюю ссылку uo.UserID в строке INNER JOIN UserAddressOrder uo ON ua.UserID = uo.UserID, я заменил строку вызовом функции, которая принимает значение uo.UserID в качестве параметра.

Это не решает проблему элегантно, но свою работу выполнило (хотя и с небольшим снижением производительности).

person Jay    schedule 18.05.2010