DBMS 是 intersystems-cache !
动机:我需要对一个表进行左连接,这样我每次都能得到相同的消息类型列表,即使结果为零或空。不幸的是,这是一个大表,因此包含 SELECT DISTINCT()
的速度非常慢。这些应该永远不会改变,所以我想我会得到列表一次,然后静态地加入它们。
根据另一个 SO 问题,这是我必须替换 SELECT DISTINCT()
的内容:
SELECT 'HS.MESSAGE.GATEWAYREGISTRATIONREQUEST' as MessageBodyClassName
UNION SELECT 'HS.MESSAGE.MERGEPATIENTREQUEST'
UNION SELECT 'HS.MESSAGE.PATIENTSEARCHREQUEST'
这将返回看起来完全符合预期的结果,与 Distinct 查询相同。但是,当我将其插入我的 JOIN 语句时,所有计数都返回为零。
查询失败
SELECT mh.MessageBodyClassName, count(l.MessageBodyClassName) as MessageCount FROM
(
SELECT 'HS.MESSAGE.GATEWAYREGISTRATIONREQUEST' as MessageBodyClassName
UNION SELECT 'HS.MESSAGE.MERGEPATIENTREQUEST'
UNION SELECT 'HS.MESSAGE.PATIENTSEARCHREQUEST'
) mh LEFT JOIN
(
SELECT messageBodyClassName FROM ens.messageheader WHERE TimeCreated > DATEADD(hh, -1, GETUTCDATE())
) l ON mh.MessageBodyClassName = l.MessageBodyClassName
GROUP BY mh.MessageBodyClassName
失败的结果
MessageBodyClassName MessageCount ------------------------------------- ------------ HS.MESSAGE.GATEWAYREGISTRATIONREQUEST 0 HS.MESSAGE.MERGEPATIENTREQUEST 0 HS.MESSAGE.PATIENTSEARCHREQUEST 0
工作查询
SELECT mh.MessageBodyClassName, count(l.MessageBodyClassName) as MessageCount FROM
(
SELECT DISTINCT(MessageBodyClassName) FROM ens.messageheader
) mh LEFT JOIN
(
SELECT messageBodyClassName FROM ens.messageheader WHERE TimeCreated > DATEADD(hh, -1, GETUTCDATE())
) l ON mh.MessageBodyClassName = l.MessageBodyClassName
GROUP BY mh.MessageBodyClassName
工作和预期结果
MessageBodyClassName MessageCount ------------------------------------- ------------ HS.MESSAGE.GATEWAYREGISTRATIONREQUEST 0 HS.MESSAGE.MERGEPATIENTREQUEST 0 HS.MESSAGE.PATIENTSEARCHREQUEST 54
对于 VKP:为什么结果不同?我如何调整带有文字的第一个查询以获得正确(相同)的结果?
最佳答案
我能想到的最后一件事是将您的 DISTINCT
查询运行一次到数据库中的永久表中。这样,查询中的内部 SELECT
只需处理这三行。内部查询会丢失 DISTINCT
,比如
SELECT MessageBodyClassName FROM ens.messageheader_permvals
编辑:以下答案无效
这可能是一个远景,但如果它不起作用,它可能会帮助您诊断问题。而不是 UNION
尝试
SELECT MessageBodyClassName FROM ens.messageheader
WHERE MessageBodyClassName in (
'HS.MESSAGE.GATEWAYREGISTRATIONREQUEST',
'HS.MESSAGE.MERGEPATIENTREQUEST',
'HS.MESSAGE.PATIENTSEARCHREQUEST')
只有当这些值实际存在于表中并且与 MessageBodyClassName
的格式兼容时,才应该返回记录,我们知道使用 DISTINCT
版本可以工作。我不知道这样性能是否会更好,但希望它能对这个问题有所启发。
编辑:以下答案不适用,因为 OP 实际上是在尝试选择文字引用值
您的 UNION 查询中没有 FROM
语句。尝试
SELECT 'HS.MESSAGE.GATEWAYREGISTRATIONREQUEST' as MessageBodyClassName
FROM ens.messageheader
UNION SELECT 'HS.MESSAGE.MERGEPATIENTREQUEST'
FROM ens.messageheader
UNION SELECT 'HS.MESSAGE.PATIENTSEARCHREQUEST'
FROM ens.messageheader
查询的其余部分看起来是正确的。
关于sql - 在静态项目列表上左加入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40179793/