Проблема SQL-союза - PullRequest
       18

Проблема SQL-союза

1 голос
/ 17 сентября 2009

Вот мой запрос:

SELECT publicationId AS PublicationID
  FROM dbo.PublicationOwner
 WHERE ownerId = 31331
UNION
SELECT AreaBuy.AreaBuyID AS PublicationID
  FROM AreaBuy 
  JOIN PublicationAreaBuy ON AreaBuy.AreaBuyID = PublicationAreaBuy.AreaBuyID
 WHERE PublicationAreaBuy.PublicationID IN (SELECT publicationId
                                              FROM dbo.PublicationOwner
                                             WHERE ownerId = 31331)
ORDER BY publicationId

Я пытаюсь сделать следующее:

Получите список идентификаторов публикации, где идентификатор владельца равен 31331, и добавьте (объедините) любые идентификаторы areabuy (как идентификатор публикации), если идентификатор публикации в таблице покупок области есть в результатах первого запроса. 1006 *

Что не так? И да, 31331 является правильным идентификатором владельца и возвращает идентификатор публикации, который также находится в таблице покупок области.

Ответы [ 2 ]

1 голос
/ 17 сентября 2009

Похоже на классическое смешение. Я не вижу никакого сходства между атрибутами публикацииId и AreaBuyId. Это могут быть просто очень плохо названные столбцы :-). Объединение таких разных атрибутов не похоже на правильный путь.

Почему нет:

SELECT O.publicationId , A,AreaBuyId
  FROM dbo.PublicationOwner O
  LEFT OUTER JOIN dbo.AreaBuy A
   ON O.AreaBuyId = A.AreaBuyId
 WHERE OwnerId =31331 

Получите то, что вы хотите?

0 голосов
/ 17 сентября 2009

Мне нравится идея рекурсивного CTE для этого, поскольку мы хотим добавить к исходному списку.

DECLARE @ownerid INT;
SET @ownerid = 31331;

WITH Publications AS
(
SELECT publicationId AS PublicationID, 'P' AS Rowtype
FROM dbo.PublicationOwner 
WHERE ownerId = @ownerid

UNION ALL

--Note, I am not using the AreaBuy table, because the info is in PublicationAreaBuy
SELECT a.AreaBuyID, 'A' AS Rowtype
FROM Publications AS p
JOIN PublicationAreaBuy AS a
ON a.PublicationID = p.PublicationID
)
SELECT *
FROM Publications
ORDER BY PublicationID
;

И ... выполнение объединения остановит все проблемы с NULL в предложении IN.

Изменить: Этот следующий запрос будет работать в версиях, предшествующих SQL 2005

DECLARE @ownerid INT
SET @ownerid = 31331

SELECT publicationId AS PublicationID, 'P' AS Rowtype
FROM dbo.PublicationOwner 
WHERE ownerId = @ownerid

UNION ALL

--Note, I am not using the AreaBuy table, because the info is in PublicationAreaBuy
SELECT a.AreaBuyID, 'A' AS Rowtype
FROM (
      SELECT publicationId AS PublicationID, 'P' AS Rowtype
      FROM dbo.PublicationOwner 
      WHERE ownerId = @ownerid
   ) AS p
JOIN PublicationAreaBuy AS a
ON a.PublicationID = p.PublicationID

ORDER BY PublicationID
...