Вложенный оператор SQL Select не выполняется на SQL Server 2000, нормально на SQL Server 2005 - PullRequest
1 голос
/ 13 мая 2010

Вот запрос:

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

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

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

Очень ценится.

[EDIT]

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

Снова выдается ошибка:

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

1 Ответ

0 голосов
/ 18 мая 2010

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

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

...