sql - 按预查询记录中的属性查询(Oracle)
问题描述
有一个如下表MEETINGPARTICIPANT
,PK 是ORGID
,MEETINGID
并且PARTICIPANTID
Name Null? Type
------------------ -------- -------------
ORGID NOT NULL NUMBER(10)
MEETINGID NOT NULL VARCHAR2(32)
PARTICIPANTID NOT NULL VARCHAR2(32)
EMPLOYEEID NOT NULL VARCHAR2(32)
DISPLAYNAME VARCHAR2(128)
EMAIL VARCHAR2(128)
JOINTIME NOT NULL DATE
LEAVETIME NOT NULL DATE
CREATETIME NOT NULL DATE
LASTMODIFIEDTIME NOT NULL DATE
第 1 步,按和列出记录ORGID
,得到一个记录列表。MEETINGID
EMPLOYEEID
SELECT
*
FROM
MEETINGPARTICIPANT
WHERE
ORGID=#{orgId}
AND MEETINGID=#{meetingId}
AND EMPLOYEEID=#{employeeId}
步骤2,迭代步骤1的每条记录,再按步骤1的and搜索EMAIL
,DISPLAYNAME
合并成一个大的记录列表
for (each record in step 1) {
SELECT
*
FROM
MEETINGPARTICIPANT
WHERE
ORGID=#{orgId}
AND MEETINGID=#{meetingId}
AND EMAIL=#{record.email} AND DISPLAYNAME=#{record.displayName}
Merge searched records to mergedRecords
}
第三步,返回mergedRecords
问题是,如何将步骤 1 和 2 中的 SQL 合并为一个 SQL?
解决方案
看来下面的 SQL 有效。NVL(EMAIL, ' ')
and将NVL(DISPLAYNAME, ' ')
处理 EMAIL 或 DISPLAYNAME 为空的记录。
SELECT
*
FROM
MEETINGPARTICIPANT
WHERE
ORGID=#{orgId}
AND MEETINGID=#{meetingId}
AND (NVL(EMAIL, ' '), NVL(DISPLAYNAME, ' ')) IN (
SELECT
NVL(EMAIL, ' '), NVL(DISPLAYNAME, ' ')
FROM
MEETINGPARTICIPANT
WHERE
ORGID=#{orgId}
AND MEETINGID=#{meetingId}
AND EMPLOYEEID=#{employeeId}
)
推荐阅读
- c - 你会如何解释这个反汇编列表?
- automated-tests - 在赛普拉斯的同一测试中两次调用 cy.server() 是否可以
- swiftui - SwiftUI - 如何使用按钮显示文本,然后使用计时器
- sql-server - 在不授予权限的情况下通过 SQL 查询获取磁盘的全部容量?
- django-rest-framework - Django 可写嵌套序列化器 - 错误非空约束
- java - 我可以在@Value 注释中传递变量来读取属性文件,其键存储在字符串变量中吗?
- php - 我想从此查询中排除一些公司名称
- kubernetes - 从 kubernetes 内部的 InfluxDb 导出数据
- java - 我们可以使用 Liquibase 监控数据库表中新添加的数据吗?
- apache-spark - 我们如何在 Spark 结构化流 2.4.4 中缓存/持久化数据集