我有三张桌子,分别是TabA、TabB和TabC.以下是这些表中的一些有用列:

TabA(ID VARCHAR2 Primary Key, ..)

TabB(ID VARCHAR2, Value CHAR(1), LastUpdated Date)

TabC(ID VARCHAR2 Primary Key, Value CHAR(1), LastUpdated Date)

这里Value是一个标志"Y"或"N".我想使用这3个表获得所有ID及其Value.首先,我想查看所有表中存在的所有不同的ID.由于Value不在TabA中,我将只在TabB和TabC中查找Value.如果对于一个特定的IDValue不在任何表中,我将假定它为"N".假设对于一个特定的ID,值在TabB和TabC中,我想取Value,其中LastUpdated更大.

我try 过使用循环,但这不是非常有效的解决方案.我只需要结果游标中的KeyValue,并希望为此保留一个查询.

有人能帮忙找出一个比使用循环更好的解决方案吗.

编辑-

以下是一个示例:

假设塔巴是-

ID
100
101
102

选项卡B

ID Value LastUpdated
99 Y 21-May-22
100 N 22-May-22
103 N 23-May-22

TabC是-

ID Value LastUpdated
102 Y 20-May-22
103 Y 24-May-22
104 N 21-May-22

结果应该是-

ID Value Why?
99 Y from TabB
100 N from TabB
101 N In TabA only so defaulting N
102 Y from TabC
103 Y In TabB and TabC but LastUpdated is greater in TabC so taking TabC value
104 N from TabC

编辑-

如果ID在TabB和TabC中具有相同的LastUpdated,但值不同,则会出现预期结果-这可以忽略,因为这种情况很少见.我们可以假设这永远不会发生.

推荐答案

您可以try 以下操作:

SELECT id, value FROM
(SELECT id, value, ROW_NUMBER()
OVER (PARTITION BY id ORDER BY lastupdated DESC) AS rownr
FROM
(SELECT id, 'N' AS value, sysdate AS lastupdated FROM taba
WHERE id NOT IN (SELECT id FROM tabb) 
AND id NOT IN (SELECT id FROM tabc)
UNION
SELECT id, value, MAX(lastupdated) AS lastupdated
FROM tabb
GROUP BY id, value
UNION
SELECT id, value, MAX(lastupdated) AS lastupdated
FROM tabc
GROUP BY id, value
ORDER BY id, lastupdated DESC)) WHERE rownr = 1;

至少在我的小提琴示例中,这是正确的:db<>fiddle

Sql相关问答推荐

判断Pyspark生成的SQL查询

如何实现一个广泛的多级自连接PostgreSQL查询?

在SQL中创建一个计数器,根据BigQuery/SQL中的条件递归地添加行值

使用Mac日志(log)时间找出SQL中的好小时和坏小时

如何利用单列历史SQLsnowflake获得合并结果

值对于类型字符来说太长

使用SQL数据库中的现有列派生或修改几个列

按用户和时间列出的SQL Group考勤列表

表函数的作用域和功能

使用与JOIN一起使用的查询后进行分页和排序

每个学校 Select N个最新的行,但跳过同一学生的重复行

在Oracle SQL中按月生成日期

在Postgres,什么是;.USSTZ;在';YYYY-MM-DD;T;HH24:MI:SS.USSTZ';?

如何根据 SQL 中的阈值标记一个集群中的所有值?

仅当 SQL Server 中的表为开时,才在存储过程中使用更改跟踪

根据要过滤的列的值进行联接和分组

在 SQL 查询中创建滚动日期

奇怪的甲骨文行为

在 Athena / Presto 中提取 JSON 对象以获取动态密钥

Amazon Redshift - 子计划的哈希表不存在