2009-09-17 86 views
1

这里是我的查询:SQL联盟问题

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 

我所试图做的是:

获取的发布ID的列表,其中所有者ID等于31331并添加(联合)如果区域购买表中的发布ID位于第一个查询的结果中,则为任何区域购买ID(如发布ID)。

出了什么问题?是的,31331是正确的所有者ID,并确实返回也在区域购买表中的出版物ID。

+0

哪个版本是“第8节”工作? 2000? 2005年? 2008年? – 2009-09-17 01:10:11

+0

sql 7,这是2000. – flavour404 2009-09-17 01:15:24

+0

嗡嗡声...奇怪的情况。 @ flavour404,你可以确认通过在UNION的任一侧运行每​​个查询,你会得到结果吗?另外,你是直接在SQL mgt studio中尝试这个,还是从程序中提取? – mjv 2009-09-17 01:26:17

回答

0

我喜欢这个递归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 
; 

And ...执行连接将停止IN子句中NULL的任何问题。

编辑:接下来的这个查询将在2005以前的版本SQL

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 
+0

不能使用'with'关键字,我的sql版本不允许它。 – flavour404 2009-09-17 05:52:50

+0

但问题被标记为SQL 2005 ... – 2009-09-17 12:01:45

+0

@Rob:SS2005标记是我的错,对不起。 – 2009-09-17 14:14:40

1

看起来像经典混搭。我没有看到属性publicationId和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

不,我需要区域购买ID出现在出版物ID列,因为后来被视为这样。 – flavour404 2009-09-17 01:19:57