2017-03-07 19 views
1

我有一個查詢被用來返回數據:結合使用SELECT結果,其中多行變量

Select top 100 
     cnb.ndc_id, 
     cnb.contract_num_val, 
     cnb.quote_price, 
     cnb.eff_dt, 
     cnb.end_dt, 
     cnb.discount_pct, 
     cnb.rebate_pct 
from [NDC_ATTR] ndc 
    INNER JOIN CONTRACT_NDC_BRG cnb ON ndc.attr_val=cnb.NDC_ID 
where ndc.field_id = 69 
and cnb.contract_ndc_brg_id = @CONT; 

當我運行它,我得到一個錯誤:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

我知道這是因爲@CONT有多行。但這正是我需要的。

我一直在尋找通過帖子,它似乎不鼓勵在SQL中使用循環。 (糾正我,如果我錯了)

我將如何返回上面的查詢的聯合,但每行返回@CONT中的每一行?

編輯:

@CONT定義:

declare @CONT varchar(50) = ( 
    SELECT contract_ndc_brg_id 
    FROM contract_ndc_brg 
    INNER JOIN ndc ON contract_ndc_brg.ndc_id = ndc.item_pk 
    where item_id = @VALUE 
    ); 
+0

是@cont表變量? – RThomas

+0

@RThomas它是一個選擇語句,其中一列放入一個變量中。 –

+0

如何定義「@ CONT」? – dnoeth

回答

2

可以擺脫@CONT,如果你能在查詢加盟ndc像這樣:

select top 100 
    cnb.ndc_id 
, cnb.contract_num_val 
, cnb.quote_price 
, cnb.eff_dt 
, cnb.end_dt 
, cnb.discount_pct 
, cnb.rebate_pct 
from [NDC_ATTR] ndc 
    inner join CONTRACT_NDC_BRG cnb 
    on ndc.attr_val = cnb.NDC_ID 
    inner join ndc as i 
     on cnb.ndc_id = i.item_pk 
where ndc.field_id = 69 
    and i.item_id = @VALUE 

或轉換爲使用exists()像這樣:

select top 100 
    cnb.ndc_id 
, cnb.contract_num_val 
, cnb.quote_price 
, cnb.eff_dt 
, cnb.end_dt 
, cnb.discount_pct 
, cnb.rebate_pct 
from [NDC_ATTR] ndc 
    inner join CONTRACT_NDC_BRG cnb 
    on ndc.attr_val = cnb.NDC_ID 
where ndc.field_id = 69 
    and exists (
    select 1 
    from ndc as i 
    where i.item_pk = cnb.ndc_id 
     and i.item_id = @VALUE 
    ) 
+1

這個概念是正確的,NDC的多種用途會引起問題。一次作爲別名,一次作爲實際的表名。 – RThomas

+0

@RThomas是的,這正是我剛纔測試時發生的事情。 –

+0

@RThomas謝謝你,糾正了鋸齒。 – SqlZim

2

編輯:我剛纔看到後面@cont您的查詢,這應該工作,但我個人更喜歡通過SqlZim給出了答案:

declare @CONT TABLE (value varchar(500)) 

SELECT contract_ndc_brg_id 
FROM contract_ndc_brg 
INNER JOIN ndc 
ON contract_ndc_brg.ndc_id = ndc.item_pk 
where item_id = @VALUE 

Select top 100 cnb.ndc_id, cnb.contract_num_val, cnb.quote_price,cnb.eff_dt, cnb.end_dt, cnb.discount_pct, cnb.rebate_pct 
from [NDC_ATTR] ndc 
INNER JOIN CONTRACT_NDC_BRG cnb 
ON ndc.attr_val=cnb.NDC_ID 
where ndc.field_id=69 and cnb.contract_ndc_brg_id IN (@CONT); 
+0

這有相同的問題,如果有多個行。 –

+0

如果您想使用該技術,應該是'IN(SELECT contract_ndc_brg_id FROM @CONT)' –

2

爲什麼要使用一個變量呢?只需插入子查詢:

Select top 100 cnb.ndc_id, cnb.contract_num_val, cnb.quote_price, cnb.eff_dt, cnb.end_dt, cnb.discount_pct, cnb.rebate_pct 
from [NDC_ATTR] ndc inner join 
    CONTRACT_NDC_BRG cnb 
    on ndc.attr_val=cnb.NDC_ID 
where ndc.field_id = 69 and 
     cnb.contract_ndc_brg_id in (select contract_ndc_brg_id 
            from contract_ndc_brg join 
             ndc 
             on contract_ndc_brg.ndc_id = ndc.item_pk 
            where item_id = @VALUE 
           );