首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WHERE和多行变量组合SELECT结果

使用WHERE和多行变量组合SELECT结果
EN

Stack Overflow用户
提问于 2017-03-08 00:27:39
回答 3查看 68关注 0票数 1

我有一个用来返回数据的查询:

代码语言:javascript
复制
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;

当我运行这段代码时,我得到一个错误:

代码语言:javascript
复制
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已定义:

代码语言:javascript
复制
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 
   );
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-08 00:36:20

如果您可以在查询中连接到@CONT,则可以摆脱ndc,如下所示:

代码语言:javascript
复制
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(),如下所示:

代码语言:javascript
复制
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
    )
票数 2
EN

Stack Overflow用户

发布于 2017-03-08 00:30:22

编辑:我刚刚在@cont后面看到了你的查询,这应该是可行的,但我个人更喜欢SqlZim给出的答案:

代码语言:javascript
复制
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 );
票数 2
EN

Stack Overflow用户

发布于 2017-03-08 00:44:54

为什么要使用变量呢?只需插入子查询:

代码语言:javascript
复制
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
                                 );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42653357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档