【问题标题】:Subquery in Case Expressions案例表达式中的子查询
【发布时间】:2016-04-23 17:21:13
【问题描述】:

我有以下数据。

输出:

id  cid price   sold
--------------------
 1  1   10      20     
 2  1   30      40      
 3  2   50      60

我需要的是这个:

 id cid Amount
--------------
  1 1   20     
  2 1   10      
  3 2   30

如果id = cid 则按其他金额出售

如果id != cid,那么对于cid的匹配id的价格作为金额(请参考上面的输出,如果它是混乱的!)

我有以下 SQL 查询:

 declare @tg table(id int, cid int, price int, sold int)

 insert into @tg values(1, 1, 10, 20); 
 insert into @tg values(2, 1, 30, 40);
 insert into @tg values(3, 2, 50, 60);

SELECT 
    id, cid, 
    CASE WHEN id  = cid 
           THEN sold 
         WHEN B.id IN (SELECT 
                           CASE WHEN id != cid 
                                THEN cid 
                           END AS cid1 
                       FROM @tg A 
                       WHERE A.cid = B.id) 
           THEN price  
    END as amount 
FROM 
    @tg AS B
 --OR
select
id,cid,
CASE WHEN id  = cid THEN sold else price END as amount from @tg
 as B

id != cid 时不起作用。

【问题讨论】:

  • 这是一个case表达式,不是case语句...
  • @jarlh 谢谢 :) 现在知道 CASE 表达式和语句之间的区别。不同之处在于该语句以 END CASE 语句结束,而不仅仅是 END。 PL/SQL 语句本质上是 IF .. THEN .. ELSIF 语句列表的替代方案。 (oracle-base.com/articles/9i/case-expressions-and-statements-9i)
  • 并且case表达式有返回值,而case语句只是代码的条件执行。

标签: sql sql-server oracle oracle11g


【解决方案1】:
select id,cid,case when id=cid then sold else (select price from @tg t1 where t1.id = t2.cid) end as amount
from @tg t2

我想这就是你要找的,IF id=cid take sold,否则 > 从 cid = id 的已售表中获取相应的价格

【讨论】:

  • 没问题,随时。
  • 所以我觉得我现在知道什么是 Co 相关子查询。而这里发生的事情是每次对内部查询( cid )中的每条记录( id )执行外部查询。
【解决方案2】:

像这样修改SELECT

select  id,cid, CASE WHEN id  = cid THEN sold 
  WHEN id  <>  cid 
      THEN price  
      END as amount from @tg
 as B

这将在id = cid 否则Prize 时返回出售

【讨论】:

  • 这甚至不正确,为什么他会获得支持?他想要对应 ID=CID 的价格,而不是 IDCID 的价格
  • select id,cid, CASE WHEN id = cid THEN sell else price END as amount from @tg as B 这和你的答案一样,在这里你不需要写“WHEN id cid " 因为错误条件总是以 ELSE 部分结束。但这不是正确的答案,因为它不检查 id = cid 条件(数据的其他部分)。无论如何都很好尝试:)
【解决方案3】:

我认为这只是作为一个连接更清楚:

select tg.*, tgc.price as sold
from @tg tg left join
     @tg tgc
     on tg.cid = tgc.id;

您只是在同一张表中查找值。您实际上不需要将join 短路。

或者,如果您更喜欢子查询:

select tg.*,
       (select tgc.amount from @tg tgc where tgc.id = tg.cid)
 from @tg tg;

在这两种情况下,使用表别名很重要。否则,您将无法区分临时表。

【讨论】:

  • 我们没有金额列,它的别名列名来自价格和销售列
【解决方案4】:
select 
  id, 
  cid, 
  case when cid = id then sold 
    else (select price from @tg where id=c.cid )
  end as amount  
from @tg c

【讨论】:

  • 请解释你的答案。它目前被视为低质量的帖子。谢谢!
  • 我使用了相关子查询。在这里,当它检查 cid=id 的 @tg 作为 c 表时,它会更正它打印已售出的 else goies 到 else 部分,然后它获取外部查询 cid no 并将其作为 id 的值提供给内部表,然后它获取价格
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2014-11-10
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
相关资源
最近更新 更多