Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL情况下的多重条件_Sql_Oracle_Case - Fatal编程技术网

SQL情况下的多重条件

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 我可以这样

我有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

我可以这样做吗?我试图运行脚本,但它似乎非常缓慢

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的列
  • 第二行:您又添加了两个表,并且再次使用逗号这很糟糕,非常非常糟糕。永远不要将ANSI风格的连接与“逗号语法”混用,混用这些风格会让人做噩梦
  • 第二行和第三行:您重复了
    警报\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