2009-09-17 116 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