2011-08-10 20 views
0

我有一個以下查詢在子查詢中有連接,並且從主要查詢從子句中引用了連接表。這是SQL Server 2000語法,我試圖將它遷移到2008語法,但在運行時出現錯誤。請建議。如何實現在SQL 2008中的主要查詢中引用表的子查詢中的連接

CREATE TABLE [dbo].[PRODUCT] 
(
     [pid] [int] NULL, 
     [NAME] [nchar](10) NULL, 
     [PDID] [int] NULL 
) ON [PRIMARY] 

CREATE TABLE [dbo].[PRODUCTDESC] 
(
     [PDID] [int] NULL, 
     [DESC] [nchar](10) NULL 
) ON [PRIMARY] 

--Test Data 
insert into PRODUCT values (1,'ONE',1); 
insert into PRODUCT values (2,'2',2); 
insert into PRODUCT values (3,'3',2); 
insert into PRODUCT values (4,'4',null); 
insert into PRODUCT values (5,'4',5); 

INSERT INTO PRODUCTDESC VALUES (1,'ONENEN'); 
INSERT INTO PRODUCTDESC VALUES (2,'TWEONEN'); 

-- SQL Server 2000 
SELECT 
    Name, 
    (SELECT [DESC] 
    FROM PRODUCTDESC 
    WHERE PRODUCT.PDID *= PRODUCTDESC.PDID) 
FROM 
    PRODUCT 

--RESULTS 
/* 
    Name (No column name) 
    ONE   ONENEN  
    2   TWEONEN 
    3   TWEONEN 
    4   NULL 
    */ 

-- SQL Server 2008 
SELECT 
    NAME, 
    (SELECT [DESC] 
    FROM PRODUCT 
    LEFT OUTER JOIN PRODUCTDESC ON PRODUCT.PDID = PRODUCTDESC.PDID) 
FROM 
    PRODUCT 

--RESULTS 
/* 
Msg 512, Level 16, State 1, Line 1 
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 
*/ 

在上述2008年的查詢與子查詢中我們如何可以訪問主查詢形式的條款提到的表,讓我不明白的子查詢returend超過1個值誤差

請建議。

+1

sqlnewbie:您不能隨意刪除其他人的帖子的內容,請停止提示此類修改。我再次回顧您的問題,以便包含所有人在此回答的內容。 –

+1

@wesley - 我再次回滾 – JNK

+0

sqlnewbie,編輯是澄清,拼寫,語法,標點符號,格式等 - 我不知道你有什麼想法,但我不認爲任何人會感激你擦除回答他們花時間提供給你。 –

回答

0

這是你想要做的嗎?

select p.Name,pdesc.DESC, from PRODUCT p inner join PRODUCTDESC pdesc on pdesc.PDID=p.PDID 
+0

謝謝你,是的,這會得到我的結果,但我正在尋找一種替代方法,我們可以如何訪問SELECT子句中定義的子查詢連接中的外部查詢表。 – sqlnewbie

2
SELECT PRODUCT.NAME 
     ,PRODUCTDESC.[DESC] 
FROM PRODUCT 
LEFT JOIN PRODUCTDESC 
    ON PRODUCT.PDID = PRODUCTDESC.PDID 

注意,這個問題是因爲你有一個標量子查詢,它必須返回只有一行(或沒有行)。請注意,這意味着在SQL Server 2000中,具有該數據的原始查詢也會失敗。此外,這兩款的SQL Server 2000和SQL Server 2008 R2和所有版本之間的左連接* =運營商甚至沒有必要:

DECLARE @PRODUCT TABLE (
    [PDID] [int] NULL, 
    [NAME] [nchar](10) NULL 
) 

DECLARE @PRODUCTDESC TABLE (
    [PDID] [int] NULL, 
    [DESC] [nchar](10) NULL 
) 

--Test Data 
insert into @PRODUCT values (1,'ONE'); 
insert into @PRODUCT values (2,'2'); 
insert into @PRODUCT values (3,'3'); 
insert into @PRODUCT values (4,'4'); 

INSERT INTO @PRODUCTDESC VALUES (1,'ONENEN'); 
INSERT INTO @PRODUCTDESC VALUES (2,'TWEONEN'); 


--SQL 2000-2008R2 
SELECT Name, 
     (SELECT [DESC] 
     FROM @PRODUCTDESC AS PRODUCTDESC 
     WHERE PRODUCT.PDID = PRODUCTDESC.PDID) 
FROM @PRODUCT AS PRODUCT 
+0

謝謝,是的,這將取得我的結果,但我正在尋找一種替代方法,我們可以如何訪問外部查詢表內的子查詢連接在select子句中定義 – sqlnewbie

+0

@Srinivas - 你的錯誤是因爲子查詢不是能夠用作標量。您可以在子查詢中使用外部值。在你的情況中,因爲你使用兩次PRODUCT,所以你需要別名外層,以便內層不隱藏。我相信你的第一個查詢在SQL Server 2000中會出現同樣的問題,因爲子查詢在作爲標量使用時只需要返回一行。 –

+0

@Srinivas查看我的編輯 –

0

你不需要外加入你的子查詢。這將工作得很好。

SELECT Name, 
     (SELECT [DESC] 
     FROM PRODUCTDESC 
     WHERE PRODUCT.PDID = PRODUCTDESC.PDID) 
FROM PRODUCT