如果第一个没有可用记录,则从视图中选择并从一个表或另一个表中加入

Posted

技术标签:

【中文标题】如果第一个没有可用记录,则从视图中选择并从一个表或另一个表中加入【英文标题】:Select from view and join from one table or another if no record available in first 【发布时间】:2015-05-26 17:57:16 【问题描述】:

我有一个视图和两个表。表一和表二的列相同,但表一的记录数很少,表二的数据旧且记录数很大。

我必须将这两个表加入一个视图,才能从表一中获取最新数据;如果视图中的记录在表一中不可用,那么我必须从表二中选择记录。

如何使用 mysql 实现这一点?

通过在互联网上进行一些研究,我了解到我们不能在 from 子句中应用完全联接和子查询。

【问题讨论】:

MySql 和 Sql Server 不是一回事 你有唯一的ID吗? 是的,我们有唯一的 id... 我们应该使用任何 case when 声明相同吗?或任何while循环?它在我的 sql 中可用吗? 【参考方案1】:

只需对结果进行简单的 UNION,不包括 table2 中已在 table1 中提到的记录:

SELECT * FROM table1
UNION
SELECT * FROM table2
WHERE NOT EXISTS (SELECT * FROM table1 WHERE table2.id = table1.id)

【讨论】:

感谢@Peter 的宝贵建议 :)【参考方案2】:

类似的东西。

SELECT *
FROM   view1 V
       INNER JOIN (SELECT COALESCE(a.commoncol, b.commoncol) AS commoncol
                   FROM   table1 A
                          FULL OUTER JOIN table2 B
                                       ON A.commoncol = B.commoncol) C
               ON v.viewcol = c.commoncol 

如果您使用的是Mysql,请查看此处以模拟Full Outer Join in MySQL

【讨论】:

感谢@Fireblade 的宝贵建议:)【参考方案3】:

您是否尝试从两个表中更新视图,其中视图中的旧记录需要被表 1 中的最新/更新记录覆盖,而表 1 中不存在的记录需要从表 2 中追加? ,或者您是从两个表创建一个视图?

【讨论】:

感谢您的重播。视图有 4 个连接,而不是来自这两个表。但映射列可用。 例如,视图正在获取5条记录(1,2,3,4,5),这5条​​记录可能在表a中也可能不可用,首先我们必须得到匹配表 a 中的记录,如果在记录 a 中找不到记录,则我们必须从表 b 中获取。

以上是关于如果第一个没有可用记录,则从视图中选择并从一个表或另一个表中加入的主要内容,如果未能解决你的问题,请参考以下文章

《SQLite3 — 子句》

SQL Server - 如果两个特定字段都为空,则从视图中排除记录

索引视图中完全外连接的替代方案

ORA-00942: 从异构服务的表中选择某些内容时,表或视图不存在

存储过程,并从两个几乎相同的视图中选择

如果连接存在,则从连接表返回值