T-SQL JOIN не возвращает действительные результаты, но отдельный запрос - PullRequest
0 голосов
/ 13 августа 2011

У меня есть запрос, который работает для каждого заказа, кроме одного.Вот часть, которая сейчас не работает:

DECLARE @ordernum INT
SELECT @ordernum = 101257

SELECT  o.CustomerID , ups.*
            From dbo.orders o with (NOLOCK)
      left join (
           Select top 1 UPSAccountInfo.UPSAccount as UPSAccount1
      ,UPSAccountInfo.CID as UPSCID
      ,UPSAccountInfo.Address as  UPSAddress1
      ,UPSAccountInfo.DesiredService  UPSDesiredService1
      ,UPSAccountInfo.Address2 as UPSAddress2
      ,UPSAccountInfo.Suit as UPSSuite
      ,UPSAccountInfo.city as UPSCity
      ,UPSAccountInfo.Country as UPSCountry
      ,UPSAccountInfo.SP as UPSState
      ,UPSAccountInfo.Zip as UPSZip
  FROM UPSAccountInfo
  with (NOLOCK)
   order by date desc
      ) ups on ups.upscid = o.customerid
 WHERE o.OrderNumber = @ordernum

Это часть более крупного запроса, я только что вытащил то, что не работает.Не работая, я имею в виду, что он возвращает значение Customerid, но не UPSAccountInfo.Так что на самом деле это возвращает запись.

Однако, это работает просто отлично:

Select top 1 UPSAccountInfo.UPSAccount as UPSAccount1
      ,UPSAccountInfo.CID as UPSCID
      ,UPSAccountInfo.Address as  UPSAddress1
      ,UPSAccountInfo.DesiredService  UPSDesiredService1
      ,UPSAccountInfo.Address2 as UPSAddress2
      ,UPSAccountInfo.Suit as UPSSuite
      ,UPSAccountInfo.city as UPSCity
      ,UPSAccountInfo.Country as UPSCountry
      ,UPSAccountInfo.SP as UPSState
      ,UPSAccountInfo.Zip as UPSZip
  FROM UPSAccountInfo
  WHERE CID = 58939
   order by date desc

Оба запроса имеют значение 58939, так что же происходит?*

Любая помощь приветствуется.Это отлично работает в течение нескольких месяцев, но сейчас, для этого заказа, это не так.Это сводит меня с ума.

О, и не стесняйтесь вносить в этот код все, что вы хотите.Я не написал это, я унаследовал это.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 13 августа 2011

Вы выбираете TOP 1 в своем подзапросе, но он не коррелирует (поскольку не может быть в JOIN).

Итак, ваша самая новая (TOP 1 ORDER BY DATE DESC = самая новая) запись не имеет того же идентификатора клиента.

Как примечание, ваши запросы не эквивалентны. Ваш второй запрос содержит предложение WHERE, ограничивающее набор результатов одним клиентом, которого нет в верхнем запросе.

2 голосов
/ 13 августа 2011

Что если вы просто используете обычное соединение вместо соединения подзапроса?Например:

SELECT TOP 1
    o.CustomerID 
    ,ups.UPSAccount as UPSAccount1
   ,ups.CID as UPSCID
   ,ups.Address as  UPSAddress1
   ,ups.DesiredService  UPSDesiredService1
   ,ups.Address2 as UPSAddress2
   ,ups.Suit as UPSSuite
   ,ups.city as UPSCity
   ,ups.Country as UPSCountry
   ,ups.SP as UPSState
   ,ups.Zip as UPSZip
FROM dbo.orders o 
LEFT OUTER JOIN UPSAccountInfo ups
ON ups.cid = o.customerid
WHERE o.OrderNumber = @ordernum
ORDER BY ups.date DESC

Если вам не нужно более одной строки из dbo.orders, это должно сработать.

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