结构化SQL

结构化SQL,sql,sql-server,oracle,Sql,Sql Server,Oracle,我有以下生成报告的要求 TASKTYPE.TaskTypeName,TASKWIP.DMTaskState_key FROM MercuryProd.TEAMSPACE.F_DMCaseWIP WIP, MercuryProd.TEAMSPACE.F_DMTaskWIP TASKWIP, MercuryProd.TEAMSPACE.D_DMDataField_BM_ExternalCaseIdentifier EXTID, MercuryProd.TEAMSPACE.D_DMTaskType T

我有以下生成报告的要求

TASKTYPE.TaskTypeName,TASKWIP.DMTaskState_key FROM MercuryProd.TEAMSPACE.F_DMCaseWIP WIP,
MercuryProd.TEAMSPACE.F_DMTaskWIP TASKWIP,
MercuryProd.TEAMSPACE.D_DMDataField_BM_ExternalCaseIdentifier EXTID,
MercuryProd.TEAMSPACE.D_DMTaskType TASKTYPE
WHERE WIP.DMCase_key=TASKWIP.DMCase_key
AND EXTID.BM_ExternalCaseIdentifier_key=WIP.VMAE_BM_ExternalCaseIdentifier_key
AND TASKTYPE.DMTaskType_key=TASKWIP.DMTaskType_key
AND EXTID.BM_ExternalCaseIdentifier='BMAX5C62970'
--AND TASKTYPE.DMTaskType_key=9 AND TASKWIP.DMTaskState_key=2
--AND TASKTYPE.DMTaskType_key=10 AND TASKWIP.DMTaskState_key=0

如果您看一下sql的最后两行,这是至关重要的。我需要满足这两个条件的所有记录。案例类型在taskwip表中可以有多个对应的子记录。我只需要筛选在子记录中两个条件都满足的情况。这是状态为2的任务9和状态为0的任务10。我在这里给出的是一条记录的示例数据。类似地,将有多个记录,如另一个案例键、多个子记录,其中任务9的状态3不是2,任务10的状态2不是0。报告不应显示此记录

我很高兴你能用任何一种DB语言开发一个查询,不管是slq服务器、Oracle还是mysql。我对逻辑比对语言格式更感兴趣


因为在结果集中可以看到,对于这个case键,有一个状态为0的tasktype 10和状态为2的tasktype 9。

对于oracle,您可以像下面那样使用listagg

   SELECT DM_Case_Key,listagg(TaskTypeName,',') within group (order by DMTaskType_key)
   over (partition by DM_Case_Key) as Tasks
   FROM your_data   

规格不明确;我猜,这只是一个猜测,我们只想在两个特定行都存在的情况下返回行

一种选择是在
EXISTS
谓词中使用相关子查询

例如,类似这样的内容:

       TASKTYPE.TaskTypeName
     , TASKWIP.DMTaskState_key 

  FROM MercuryProd.TEAMSPACE.F_DMCaseWIP  WIP

  JOIN MercuryProd.TEAMSPACE.F_DMTaskWIP  TASKWIP
    ON TASKWIP.DMCase_key = WIP.DMCase_key

  JOIN MercuryProd.TEAMSPACE.D_DMDataField_BM_ExternalCaseIdentifier  EXTID
    ON EXTID.BM_ExternalCaseIdentifier_key = WIP.VMAE_BM_ExternalCaseIdentifier_key

  JOIN MercuryProd.TEAMSPACE.D_DMTaskType  TASKTYPE
    ON TASKTYPE.DMTaskType_key = TASKWIP.DMTaskType_key

 WHERE EXTID.BM_ExternalCaseIdentifier = 'BMAX5C62970'
   AND EXISTS ( SELECT 1
                  FROM MercuryProd.TEAMSPACE.D_DMTaskType  tt92 
                 WHERE tt92.DMTaskType_key     = 9
                   AND TASKWIP.DMTaskState_key = 2
              )
   AND EXISTS ( SELECT 1
                  FROM MercuryProd.TEAMSPACE.D_DMTaskType  tt10
                 WHERE tt10.DMTaskType_key     = 10
                   AND TASKWIP.DMTaskState_key = 0
              )
   AND EXISTS ( SELECT 1
                  FROM MercuryProd.TEAMSPACE.D_DMTaskType  ttx
                 WHERE ( ttx.DMTaskType_key = 9  AND TASKWIP.DMTaskState_key = 2 )
                    OR ( ttx.DMTaskType_key = 10 AND TASKWIP.DMTaskState_key = 0 )
                HAVING COUNT(DISTINCT ttx.DMTaskType_key) = 2
              )
注意,不管子查询返回什么值,EXISTS只是检查是否至少返回一行

请注意,这并不限制返回TASKTYPE中的哪些行。如果我们想将返回限制为只返回特定的匹配行,我们可以添加到TASKTYPE联接的ON子句,或者添加到WHERE子句

   AND (  ( TASKTYPE.DMTaskType_key = 9  AND TASKWIP.DMTaskState_key = 2 )
       OR ( TASKTYPE.DMTaskType_key = 10 AND TASKWIP.DMTaskState_key = 0 )
       )

我们还可以使用其他查询模式;我们可以这样做:

       TASKTYPE.TaskTypeName
     , TASKWIP.DMTaskState_key 

  FROM MercuryProd.TEAMSPACE.F_DMCaseWIP  WIP

  JOIN MercuryProd.TEAMSPACE.F_DMTaskWIP  TASKWIP
    ON TASKWIP.DMCase_key = WIP.DMCase_key

  JOIN MercuryProd.TEAMSPACE.D_DMDataField_BM_ExternalCaseIdentifier  EXTID
    ON EXTID.BM_ExternalCaseIdentifier_key = WIP.VMAE_BM_ExternalCaseIdentifier_key

  JOIN MercuryProd.TEAMSPACE.D_DMTaskType  TASKTYPE
    ON TASKTYPE.DMTaskType_key = TASKWIP.DMTaskType_key

 WHERE EXTID.BM_ExternalCaseIdentifier = 'BMAX5C62970'
   AND EXISTS ( SELECT 1
                  FROM MercuryProd.TEAMSPACE.D_DMTaskType  tt92 
                 WHERE tt92.DMTaskType_key     = 9
                   AND TASKWIP.DMTaskState_key = 2
              )
   AND EXISTS ( SELECT 1
                  FROM MercuryProd.TEAMSPACE.D_DMTaskType  tt10
                 WHERE tt10.DMTaskType_key     = 10
                   AND TASKWIP.DMTaskState_key = 0
              )
   AND EXISTS ( SELECT 1
                  FROM MercuryProd.TEAMSPACE.D_DMTaskType  ttx
                 WHERE ( ttx.DMTaskType_key = 9  AND TASKWIP.DMTaskState_key = 2 )
                    OR ( ttx.DMTaskType_key = 10 AND TASKWIP.DMTaskState_key = 0 )
                HAVING COUNT(DISTINCT ttx.DMTaskType_key) = 2
              )
编辑

演示的第一种模式是不够的。这要求两个TASKTYPE行都与同一TASKWIP行相关,但这无法实现,因为每个TASKTYPE行都需要与TASKWIP行不同的值

我们需要在相关子查询中进行连接

大致如下:

   AND EXISTS ( SELECT 1
                  FROM MercuryProd.TEAMSPACE.F_DMTaskWIP   tw92
                  JOIN MercuryProd.TEAMSPACE.D_DMTaskType  tt92 
                    ON tt92.DMTaskType_key   = tw92.DMTaskType_key
                   AND tt92.DMTaskType_key   = 9
                 WHERE tw92.DMTaskState_key  = 2
                   AND tw92.DMCase_key       = WIP.DMCase_key
              )
   AND EXISTS ( SELECT 1
                  FROM MercuryProd.TEAMSPACE.F_DMTaskWIP   tw10
                  JOIN MercuryProd.TEAMSPACE.D_DMTaskType  tt10
                    ON tt10.DMTaskType_key   = tw10.DMTaskType_key
                   AND tt10.DMTaskType_key   = 10
                 WHERE tw10.DMTaskState_key  = 0
                   AND tw10.DMCase_key       = WIP.DMCase_key
              )

我想答案取决于你的数据库/版本。。。SQL Server或Oracle?而且,您的问题还不清楚。您想在聚合结果中进行某种排序吗?在SQL Server 2017+string_agg()中,如果从不在
FROM
子句中使用逗号。始终使用正确、明确、标准、可读的
JOIN
语法。@vipinev如果问题的回答令您满意,则您可以“选择”答案,这样该问题不会增加StackOverflow上“尚未回答”问题的递增计数。(看起来,在您之前提出的九个问题中,只有一个问题得到了回答……这并不是一个很好的记录。)而yah
EXISTS
是SQL工具带中一个功能强大的工具。感谢您的建议。我对我的问题进行了编辑,以便更清楚地了解我在寻找什么。我不是在寻找一个语法表达式来对记录进行分组。我对逻辑很感兴趣。假设表A中的数据记录1在表B中有4个子记录。我需要获取表A中的所有此类记录,其中一个子记录类型处于状态2,其他类型处于状态0。非常感谢!这正是我要找的。第一个就足以让我理解其中的逻辑。现在,我已经根据我的需求开发了这个查询,并且它的工作情况与预期一致。非常支持!谢谢你!