2015-05-20 4 views
0

Привет Мой запрос выглядит следующим образом, и содержит подзапрос внутри него:SQL Select в Sub Query

ALTER PROCEDURE [dbo].[POBalance] @PONumber NVARCHAR(50) 
AS 
BEGIN 
    SELECT CASE 
      WHEN X.STATUS = 'False' 
       THEN ( SELECT A.Description 
          ,C.qty AS POqty 
          ,B.Qty AS PDQty 
          ,CASE 
           WHEN A.partialflag = 'false' 
            THEN '0' 
           ELSE A.qty 
           END AS Balance 
          ,A.Unit 
          ,A.Unitprice 
          ,A.Partialflag 
         FROM tblPOdetails AS A 
         INNER JOIN tblPDdetails AS B ON A.id = B.id 
         INNER JOIN tblpodetailshistory AS C ON A.id = C.id 
         WHERE A.PONo = @PONumber 
         ) 
      ELSE ( SELECT A.Description 
         ,C.qty AS POqty 
         ,B.Qty AS PDQty 
         ,C.qty AS Balance 
         ,A.Unit 
         ,A.Unitprice 
         ,A.Partialflag 
        FROM tblPOdetails AS A 
        INNER JOIN tblPDdetails AS B ON A.id = B.id 
        INNER JOIN tblpodetailshistory AS C ON A.id = C.id 
        WHERE A.PONo = @PONumber) 
      END 
    FROM tblPOHeader AS X 
    WHERE x.PONo = @PONumber 
END 

Ошибка я получаю:

только одно выражение может быть указан в списке выбора когда это подзапрос не представлен с EXISTS.

Что не так с моим запросом .. кажется, мой подзаголовок в порядке.

Заранее спасибо

ответ

1

Вы действительно ищете это?

ALTER PROCEDURE [dbo].[POBalance] @PONumber NVARCHAR(50) 
AS 
BEGIN 
    DECLARE @Status NVARCHAR(MAX) 

    SELECT @Status = X.STATUS 
    FROM tblPOHeader AS X WHEREx.PONo = @PONumber 

    IF @Status = 'False' 
    BEGIN 
     SELECT A.Description 
      ,C.qty AS POqty 
      ,B.Qty AS PDQty 
      ,CASE 
       WHEN A.partialflag = 'false' 
        THEN '0' 
       ELSE A.qty 
       END AS Balance 
      ,A.Unit 
      ,A.Unitprice 
      ,A.Partialflag 
     FROM tblPOdetails AS A 
     INNER JOIN tblPDdetails AS B ON A.id = B.id 
     INNER JOIN tblpodetailshistory AS C ON A.id = C.id 
     WHERE A.PONo = @PONumber 
    END 
    ELSE 
    BEGIN 
     SELECT A.Description 
      ,C.qty AS POqty 
      ,B.Qty AS PDQty 
      ,C.qty AS Balance 
      ,A.Unit 
      ,A.Unitprice 
      ,A.Partialflag 
     FROM tblPOdetails AS A 
     INNER JOIN tblPDdetails AS B ON A.id = B.id 
     INNER JOIN tblpodetailshistory AS C ON A.id = C.id 
     WHERE A.PONo = @PONumber 
    END 
END 

Этот код будет хранить, а затем проверить значение @Status и на основе, если значение False или нет, то он возвращает результирующий набор одного из запросов.

+0

Что делать, если «SELECT @Status = X.STATUS FROM tblPOHeader AS X WHEREx.PONo = @PONumber» возвращает более одной строки ..... – Max

0

Вы не можете выбрать несколько полей для одного expression.Your псевдонима делает его более visible.You выбрать более одного значения и дают только одно имя псевдонима !! Пожалуйста, обратитесь это

Only One Expression in case

And this one too

Another one here

2

Вы не можете выбрать таблицу в случае clausule. Вы можете сделать это просто так (я не проверял):

SELECT A.Description 
           ,C.qty AS POqty 
           ,B.Qty AS PDQty 
           ,CASE 
            WHEN A.partialflag = 'false' 
             THEN '0' 
            ELSE A.qty 
            END AS Balance 
           ,A.Unit 
           ,A.Unitprice 
           ,A.Partialflag 
          FROM tblPOdetails AS A 
          INNER JOIN tblPDdetails AS B ON A.id = B.id 
          INNER JOIN tblpodetailshistory AS C ON A.id = C.id 
          INNER JOIN tblPOHeader X ON x.PONo = A.PONo 
          WHERE A.PONo = @PONumber and X.STATUS = 'False' 

    UNION ALL 

    SELECT A.Description 
          ,C.qty AS POqty 
          ,B.Qty AS PDQty 
          ,C.qty AS Balance 
          ,A.Unit 
          ,A.Unitprice 
          ,A.Partialflag 
          FROM tblPOdetails AS A 
          INNER JOIN tblPDdetails AS B ON A.id = B.id 
          INNER JOIN tblpodetailshistory AS C ON A.id = C.id 
          INNER JOIN tblPOHeader X ON x.PONo = A.PONo 
          WHERE A.PONo = @PONumber and X.STATUS <> 'False' 

Но я думаю, что Тах X.STATUS является бит - если да, то вы должны сделать это просто так:

SELECT A.Description 
           ,C.qty AS POqty 
           ,B.Qty AS PDQty 
           ,CASE 
            WHEN A.partialflag = 'false' 
             THEN '0' 
            ELSE A.qty 
            END AS Balance 
           ,A.Unit 
           ,A.Unitprice 
           ,A.Partialflag 
          FROM tblPOdetails AS A 
          INNER JOIN tblPDdetails AS B ON A.id = B.id 
          INNER JOIN tblpodetailshistory AS C ON A.id = C.id 
          INNER JOIN tblPOHeader X ON x.PONo = A.PONo 
          WHERE A.PONo = @PONumber and X.STATUS = 0 

    UNION ALL 

    SELECT A.Description 
          ,C.qty AS POqty 
          ,B.Qty AS PDQty 
          ,C.qty AS Balance 
          ,A.Unit 
          ,A.Unitprice 
          ,A.Partialflag 
          FROM tblPOdetails AS A 
          INNER JOIN tblPDdetails AS B ON A.id = B.id 
          INNER JOIN tblpodetailshistory AS C ON A.id = C.id 
          INNER JOIN tblPOHeader X ON x.PONo = A.PONo 
          WHERE A.PONo = @PONumber and X.STATUS <> 0 
+1

Вашего ответа будет на самом деле запустить оба запроса, а не только тот, который ему нужен данные. –

+1

Я думаю, что я должен запускать обе quries, потому что я не сейчас, если выберите * из tblPOHeader, где PONo = @PONumber возвращает одну или несколько строк. Если он возвращает только одну строку - вы правы. – Arkadiusz

+0

Привет @RaduGheorghiu Мне нужен только один из тех, что указаны в аргументе case, если Status (бит) = false, тогда я получу результат, если нет, тогда я получу другой результат. – Daryl

0

Когда

select * from tblPOHeader where PONo = @PONumber 

возвращает только один ряд вы можете сделать что-то вроде этого

declare @STATUS nvarchar(200) = (select STATUS from tblPOHeader where PONo = @PONumber) 
    if @STATUS = 'False' 
    SELECT A.Description 
          ,C.qty AS POqty 
          ,B.Qty AS PDQty 
          ,CASE 
           WHEN A.partialflag = 'false' 
            THEN '0' 
           ELSE A.qty 
           END AS Balance 
          ,A.Unit 
          ,A.Unitprice 
          ,A.Partialflag 
         FROM tblPOdetails AS A 
         INNER JOIN tblPDdetails AS B ON A.id = B.id 
         INNER JOIN tblpodetailshistory AS C ON A.id = C.id 
         WHERE A.PONo = @PONumber 

    ELSE 
     SELECT A.Description 
         ,C.qty AS POqty 
         ,B.Qty AS PDQty 
         ,C.qty AS Balance 
         ,A.Unit 
         ,A.Unitprice 
         ,A.Partialflag 
         FROM tblPOdetails AS A 
         INNER JOIN tblPDdetails AS B ON A.id = B.id 
         INNER JOIN tblpodetailshistory AS C ON A.id = C.id 
         WHERE A.PONo = @PONumber 
+0

Спасибо ... этот запрос работает, это мне помогает .. – Daryl