SQL情况下的多重条件
我有3个表要连接:SQL情况下的多重条件,sql,oracle,case,Sql,Oracle,Case,我有3个表要连接: ALERT_CASE_HEADER - alert_key ALERT_ITEM - entity_key -status_id -entity_name='Active Alert' STATUSES -name -id 两个警报表都使用警报键和实体键进行链接。仅当两个键的值相同且对每个可用状态名称都是entity\u name='Active Alert'时,才会进行大小写相加。表status中的id列链接到ALERT\u ITEM.status\u id 我可以这样
ALERT_CASE_HEADER
- alert_key
ALERT_ITEM
- entity_key
-status_id
-entity_name='Active Alert'
STATUSES
-name
-id
两个警报表都使用警报键和实体键进行链接。仅当两个键的值相同且对每个可用状态名称都是entity\u name='Active Alert'
时,才会进行大小写相加。表status中的id列链接到ALERT\u ITEM.status\u id
我可以这样做吗?我试图运行脚本,但它似乎非常缓慢
SELECT
SUM(
CASE
WHEN s.name = 'Pending'
AND ach.alert_key = ai.entity_key
AND ai.entity_name = 'Active Alert'
THEN 1
ELSE 0
END
) AS PENDING, SUM(
CASE
WHEN s.name = 'new'
AND ach.alert_key = ai.entity_key
AND ai.entity_name = 'Active Alert'
THEN 1
ELSE 0
END
) AS NEW, SUM(
CASE
WHEN s.name = 'cancel'
AND ach.alert_key = ai.entity_key
AND ai.entity_name = 'Active Alert'
THEN 1
ELSE 0
END
) AS CANCEL
FROM
STATUSES s, ALERT_CASE_HEADER ach, ALERT_ITEM ai;
(17年11月14日9:53提问者的回答本应是编辑:)
我正在使用的脚本如下所示,只需关注两个join语句。第二个join正在工作,但第一个没有
SELECT CUS.ORGUNIT_CODE AS ORGANIZATION_UNITS,
SUM(
CASE
WHEN S.name = 'Pending' THEN 1 ELSE 0
END
) AS PENDING_AUTOCLOSURE,
SUM(
CASE
WHEN S.name = 'New' THEN 1 ELSE 0
END
) AS NEW,
SUM(
CASE
WHEN S.name = 'Under Investigation' THEN 1 ELSE 0
END
) AS UNDER_INVESTIGATION,
SUM(
CASE
WHEN S.Name = 'Escalated' THEN 1 ELSE 0
END
) AS ESCALATED,
SUM(
CASE
WHEN S.Name = 'Recommend True Positive' THEN 1 ELSE 0
END
) AS RECOMMEND_TRUE_POSITIVE,
SUM(
CASE
WHEN S.Name = 'Reopen Under Investigation' THEN 1 ELSE 0
END
) AS REOPEN_UNDER_INVESTIGATION
FROM
STATUSES S,CUSTOMERS CUS,ALERT_ITEM AI
JOIN ALERT_ITEM AI ON S.ID = AI.STATUS_ID
JOIN ALERT_CASE_HEADER ACH ON AI.ENTITY_KEY = ACH.ALERT_KEY
WHERE AI.ENTITY_NAME = 'Active Alert'
AND AI.ORGUNIT_ID = CUS.ORGUNIT_ID
GROUP BY CUS.ORGUNIT_CODE;
您可以使用以下选项:
SELECT
SUM(
CASE
WHEN s.name = 'Pending' THEN 1 ELSE 0
END
) AS PENDING,
SUM(
CASE
WHEN s.name = 'new' THEN 1 ELSE 0
END
) AS NEW,
SUM(
CASE
WHEN s.name = 'cancel' THEN 1 ELSE 0
END
) AS CANCEL
FROM
STATUSES s
join ALERT_ITEM ai on s.id=ai.status_id
join ALERT_CASE_HEADER ach on ai.entity_key=ach.alert_key
where ai.entity_name = 'Active Alert'
查看您的代码,我建议您以这种方式重构查询 在case中使用表之间的联接而不是条件
SELECT
SUM(
CASE
WHEN s.name = 'Pending'
THEN 1
ELSE 0
END
) AS PENDING
, SUM(
CASE
WHEN s.name = 'new'
THEN 1
ELSE 0
END
) AS NEW
, SUM(
CASE
WHEN s.name = 'cancel'
THEN 1
ELSE 0
END
) AS CANCEL
FROM STATUSES s
INNER JOIN ALERT_ITEM ai ON s.id = ai.status_id
AND ai.entity_name = 'Active Alert'
INNER JOIN ALERT_CASE_HEADER ach ON ach.alert_key = ai.entity_key
在新操作代码之后更新
不要混合使用隐式连接和显式连接
SELECT CUS.ORGUNIT_CODE AS ORGANIZATION_UNITS,
SUM(
CASE
WHEN S.name = 'Pending' THEN 1 ELSE 0
END
) AS PENDING_AUTOCLOSURE,
SUM(
CASE
WHEN S.name = 'New' THEN 1 ELSE 0
END
) AS NEW,
SUM(
CASE
WHEN S.name = 'Under Investigation' THEN 1 ELSE 0
END
) AS UNDER_INVESTIGATION,
SUM(
CASE
WHEN S.Name = 'Escalated' THEN 1 ELSE 0
END
) AS ESCALATED,
SUM(
CASE
WHEN S.Name = 'Recommend True Positive' THEN 1 ELSE 0
END
) AS RECOMMEND_TRUE_POSITIVE,
SUM(
CASE
WHEN S.Name = 'Reopen Under Investigation' THEN 1 ELSE 0
END
) AS REOPEN_UNDER_INVESTIGATION
FROM
STATUSES S
JOIN ALERT_ITEM AI ON S.ID = AI.STATUS_ID
JOIN ALERT_CASE_HEADER ACH ON AI.ENTITY_KEY = ACH.ALERT_KEY
INNER JOIN CUSTOMERS CUS ON AI.ORGUNIT_ID = CUS.ORGUNIT_ID
WHERE AI.ENTITY_NAME = 'Active Alert'
GROUP BY CUS.ORGUNIT_CODE;
S.ID 00904无效标识符
ORA-00904:字符串:无效标识符
原因:输入的列名
已丢失或无效
操作:输入有效的列名。A.
有效列名必须以字母开头,且必须小于或等于
30个字符,仅由字母数字字符和
特殊字符$、和。如果它包含其他字符,则
它必须用双引号括起来。这可能不是一个好消息
保留字
这些方面存在问题
FROM
STATUSES S,CUSTOMERS CUS,ALERT_ITEM AI
JOIN ALERT_ITEM AI ON S.ID = AI.STATUS_ID
JOIN ALERT_CASE_HEADER ACH ON AI.ENTITY_KEY = ACH.ALERT_KEY
WHERE AI.ENTITY_NAME = 'Active Alert'
S
是为表状态定义的S
再次用于列S.ID
该列无效表示表statuses没有名为ID的列警报\u项目AI
来自
状态
,CUSTOMERS CUS/*将此更改为显式加入*/
在S.ID/*上加入ALERT\u ITEM AI我确信您不希望交叉加入
与其他表的表状态
有什么关系?状态表与其他表之间有关系?是的,表状态中有一个ID列链接到ALERT\u ITEM.status\u ID以获得更好的解决方案,请添加一些样本数据和预期结果。可能重复我尝试过的,它得到s.id 00904。00000-“%s:invalid identifier”s.id
和ai.status\u id的数据类型是什么?为了获得更好的解决方案,请添加一些示例数据和预期结果。这两个都是数字(38),我怀疑您的数据中存在问题。最好您添加一些样本数据和预期结果。我尝试过,它得到s.id 00904。00000-“%s:无效标识符”您的错误消息不清楚。。显示准确的错误消息,并确保在状态表中有id列是的,有,下面是完整的错误消息:ORA-00904:“s”。“id”:无效标识符00904。00000-“%s:无效标识符”*原因:*操作:第34行第32列出错错误消息为清除无效列名或缺少列名。在select语句中引用无效别名时,“无效标识符”最常见。。。显示您正在使用的所有代码。。(第34行错误列:32 mysq答案中的s.id不在第34行)我在这个问题中发表了一篇新帖子,展示了我正在使用的脚本。anks用于您的建议,query更改为explicit join,不带逗号。
FROM
STATUSES S
,CUSTOMERS CUS /* change this to explicit join */
JOIN ALERT_ITEM AI ON S.ID /* <<< wrong column name */ = AI.STATUS_ID