Мне нравится идея рекурсивного 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