联接表的案例声明

时间:2020-07-13 17:21:26

标签: sql sql-server tsql

我有两个表:

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编程非常陌生,因此,我将不胜感激!让我知道是否需要澄清任何事情。谢谢!

2 个答案:

答案 0 :(得分:2)

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

(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 Server和相关数据库中分配列别名。

答案 1 :(得分:1)

另一种方法-您可以通过将两个表都与left outer join联接来标记一条记录。我相信这比使用EXIST的{​​{1}}更快。

SQL-

subquery
相关问题