2011-08-10 10 views
0

サブクエリで結合を持つ次のクエリがあり、結合テーブルはメインクエリfrom節から参照されます。これはSQL Server 2000の構文ですが、2008年の構文に移行しようとしていますが、実行時にエラーが発生します。提案してください。私は以上の1つの値の誤差がSQL 2008のメインクエリのサブクエリ参照テーブル内の結合を実装する方法

示唆してくださいreturendサブクエリを取得しないように、私たちは、メインクエリフォーム句で参照テーブルにアクセスすることができますどのようにサブクエリ内での上記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. 
*/ 

+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の2008R2との間のすべてのバージョンの両方に参加する* =演算子が必要すらありません:

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を2回使用しているため、内側のものに隠されないように外側のものに別名を付ける必要があります。 SQL Server 2000では、副問合せがスカラとして使用されたときに1つの行のみを返す必要があるため、同じ問題で最初のクエリが失敗すると考えられます。 –

+0

@Srinivas私の編集を参照 –

0

あなたは外を必要としない、あなたのサブクエリに参加。これはうまくいくでしょう。

SELECT Name, 
     (SELECT [DESC] 
     FROM PRODUCTDESC 
     WHERE PRODUCT.PDID = PRODUCTDESC.PDID) 
FROM PRODUCT 
関連する問題