Заявление о регистре для объединенной таблицы - PullRequest
0 голосов
/ 13 июля 2020

У меня есть две таблицы:

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 ]

2 голосов
/ 13 июля 2020

Ваш код выглядит нормально, но я бы посоветовал:

(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 сервере и связанных базах данных.

1 голос
/ 13 июля 2020

Альтернативный способ - вы можете отметить запись, объединив обе таблицы с помощью left outer join. Я считаю, что это будет более быстрый подход, чем EXIST с subquery.

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' 
...