SQL创建临时表时如何实现关联记录有一个为真则全部布尔值设为真
解决方案
提供两种可直接使用的实现方式,均兼容主流SQL数据库:
方式1:EXISTS子查询实现(符合你提到的实现思路)
外层先筛选所有主项目记录,子查询判断对应主项目关联的所有记录(含自身)是否存在激活标记为Y的条目:
SELECT p.Name AS Project, CASE WHEN EXISTS ( SELECT 1 FROM Projects p2 WHERE (p2.Id = p.Id OR p2.`Master Project` = p.Id) AND p2.Active = 'Y' ) THEN 'Y' ELSE 'N' END AS Active FROM Projects p WHERE p.`Master Project` IS NULL;
方式2:分组聚合实现(写法更简洁)
利用Y的字符串排序优先级高于N、NULL会被聚合函数忽略的特性,按主项目维度分组后直接取最大值判断:
SELECT MAX(CASE WHEN p.`Master Project` IS NULL THEN p.Name END) AS Project, CASE WHEN MAX(p.Active) = 'Y' THEN 'Y' ELSE 'N' END AS Active FROM Projects p GROUP BY IFNULL(p.`Master Project`, p.Id);
注意:如果你的数据库不支持
IFNULL函数,可以替换为对应方言的空值处理函数,比如SQL Server用ISNULL、PostgreSQL/Oracle用COALESCE;带空格的字段名转义符也可以根据数据库类型调整,SQL Server用方括号[]、PostgreSQL用双引号""。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

