2017-03-07 75 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 
           );