结构化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上“尚未回答”问题的递增计数。(看起来,在您之前提出的九个问题中,只有一个问题得到了回答……这并不是一个很好的记录。)而yahEXISTS
是SQL工具带中一个功能强大的工具。感谢您的建议。我对我的问题进行了编辑,以便更清楚地了解我在寻找什么。我不是在寻找一个语法表达式来对记录进行分组。我对逻辑很感兴趣。假设表A中的数据记录1在表B中有4个子记录。我需要获取表A中的所有此类记录,其中一个子记录类型处于状态2,其他类型处于状态0。非常感谢!这正是我要找的。第一个就足以让我理解其中的逻辑。现在,我已经根据我的需求开发了这个查询,并且它的工作情况与预期一致。非常支持!谢谢你!