2010-05-13 4 views
1

Вот запрос:Вложенный 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?

Очень ценный.

[EDIT]

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

Опять же, ошибка брошена является:

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

Какая ошибка возникает с SQL 2000? – SqlACID

+0

Ошибка: Msg 8624, уровень 16, состояние 16, строка 24 Внутренняя ошибка SQL Server. – Jay

ответ

0

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

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

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