【发布时间】:2016-10-21 23:29:21
【问题描述】:
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:为什么结果不同?如何使用文字调整第一个查询以获得正确(相同)的结果?
【问题讨论】:
-
我不知道你的 dbms。无论如何,我要检查的第一件事是您的列的数据类型。如果它是 char(而不是 varcahr),您可能会在这里找到问题的解决方案
-
mh中的messageBodyClassName上的类型是varchar还是char?好奇它是否是枚举类型,并且您正在比较两种不同的类型。您的工作查询将保留这一点。 -
根据 DBVis 和 ISC ODBC 驱动程序,它是一个
VARCHAR。 -
ens.messageheader.messageBodyClassName 中可能有一个空白或特殊(非显示)字符,而不是您的硬编码值。为了证明这一点,请尝试
SELECT count(*) from ens.messageheader where messageBodyClassName in ('HS.MESSAGE.GATEWAYREGISTRATIONREQUEST', 'HS.MESSAGE.MERGEPATIENTREQUEST', 'HS.MESSAGE.PATIENTSEARCHREQUEST'),如果您的计数为零,则表中的值与您的硬编码值不匹配。你需要弄清楚为什么。试试len来统计字符或者用ASCII转换成asci字符码,看看有什么意外 -
@scott 如果两者相同。那没有意义。另一件事是您可能在不同的时间运行查询,这就是您得到不同结果的原因?
标签: intersystems-cache sql join left-join intersystems-cache