繁体   English   中英

连接表的案例语句

[英]Case Statement for Joined Table

我有两张桌子:

Account ID | A | B
-------------------
1          | x | y
2          | c | f
3          |...|...

第一个表是一般帐户列表。 第二个表是每个帐户的手头文件列表:

Account ID | Doctype
---------------------
1          | chrgoff
2          | dtpmnt
2          | chrgoff
3          | lstpmt
3          | suit

对于我正在创建的报告,我需要在第一个表中创建一个存储标志值的列,其中“Y”表示第二个表包含给定帐号的 docType“chrgoff”。

我尝试使用以下 case 语句执行此操作,但查询根本不会执行:

'chgoff' = 
    CASE
      WHEN EXISTS(SELECT docType FROM table2 WHERE docType='chrgoff' and AccountID=table1.accountID) 
      THEN 'Y'
      ELSE 'N'
   END

我对 T-SQL 编程非常陌生,所以如果能得到任何帮助,我将不胜感激。 如果我需要澄清任何事情,请告诉我。 谢谢!

您的代码看起来不错,但我建议:

(CASE WHEN EXISTS (SELECT docType FROM table2 t2 WHERE t2.docType = 'chrgoff' and t2.AccountID = table1.accountID) 
      THEN 'Y'
      ELSE 'N'
 END) as chgoff

主要区别在于:

  • 列名上没有单引号。 仅对字符串和日期常量使用单引号。
  • 限定子查询中的列引用。 不要依赖 SQL 的作用域规则。 明确。

至于as= 我更喜欢前者,因为它是标准的 SQL; =仅在 SQL 服务器和相关数据库中分配列别名。

另一种方法 - 您可以通过使用left outer join连接两个表来标记记录。 我相信这将比EXISTsubquery更快的方法。

SQL -

select t1.*, 
case when t2.account_id is not null then 'Y' else 'N' end as chgoff
from table1 t1 
left join table2 t2 on t1.account_id = t2.account_id and t2.doctype = 'chrgoff' 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM