Как реализовать объединения в таблицах ссылок подзапроса в основном запросе в SQL 2008 - PullRequest
0 голосов
/ 10 августа 2011

У меня есть следующий запрос, который имеет объединения в подзапросах, и объединенная таблица ссылается из основного запроса из предложения.Это синтаксис SQL Server 2000, я пытаюсь перенести его на синтаксис 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 года с помощью подзапроса, как мы можем получить доступ к ТАБЛИЦАМ, указанным в предложении формы основного запроса, чтобы я не получил подзапрос, возвращающий ошибку более 1 значения

Пожалуйста, предложите.

Ответы [ 3 ]

2 голосов
/ 10 августа 2011
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 голосов
/ 10 августа 2011

Вам не нужно внешнее объединение в вашем подзапросе. Это будет хорошо работать.

SELECT Name,
       (SELECT [DESC]
        FROM   PRODUCTDESC
        WHERE  PRODUCT.PDID = PRODUCTDESC.PDID)
FROM   PRODUCT
0 голосов
/ 10 августа 2011

Это то, что вы хотите сделать?

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