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

标签 sql join left-join intersystems-cache

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/

相关文章:

MySQL:使用 IN 的嵌套 SQL

java - 通过 JDBC 查询 Oracle DB 给出 null,而直接查询给出输出

sql - 使用 SSIS 包加载数据时理解间歇性不一致的问题

mysql - 使用when子句设置行数据

sql - 在单个查询中从他们的 ID 获取相关数据的最佳方法是什么?

mysql - 创建临时表运行了 30 分钟但未完成

PHP MySQL 从一张表中选择 ID,从另一张表中选择照片

r - dplyr `left_join()` 不能使用字符对象作为 LHS 变量

mysql - 连接表与包含创建问题

mysql - 在空单元格的情况下排除左连接