gpt4 book ai didi

sql - 在静态项目列表上左加入?

转载 作者:行者123 更新时间:2023-12-05 05:22:34 33 4
gpt4 key购买 nike

DBMS 是 !

动机:我需要对一个表进行左连接,这样我每次都能得到相同的消息类型列表,即使结果为零或空。不幸的是,这是一个大表,因此包含 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com