SQLite简化左外联接的并集

SQLite简化左外联接的并集,sql,sqlite,Sql,Sqlite,我继承了一些monster SQL查询,我希望尽可能简化/缩短它们 其中之一是: SELECT * FROM ( SELECT $columnsFromBothTables FROM table_abc left outer join t

我继承了一些monster SQL查询,我希望尽可能简化/缩短它们

其中之一是:

SELECT 
              * 
            FROM 
              (
                SELECT 
                  $columnsFromBothTables
                FROM 
                  table_abc
                  left outer join table_xyz using profile_id 
                union 
                select 
                  $columnsFromBothTables
                from 
                  table_xyz 
                  left outer join table_abc using profile_id
              ) 
它看起来奇怪地多余。
有没有办法把它简化成这样

SELECT * FROM (
    SELECT $columns FROM table_abc MAGIC_OPERATION table_xyz
)
这不是一个完整的外部连接吗

更新: 我的理解是,这两个表都与“profile”表有M-1关系


它们彼此之间没有直接关系

这类似于但不完全是一个
完全外部连接
。我建议将此方法用于
完全外部联接

select $columns
from abc left join
     xyz
     on . . .
union all
select $columns
from xyz left join
     abc
     on . . .
where abc.? is null;  -- some column to validate that there is no match

注意:这不会删除重复项——代码会这样做。这就是为什么这个版本应该表现得更好。但是它可能不完全符合您的要求。

类似于SQLite不支持的完全外部联接。完全外部联接也需要不存在。您确定它是其他列而不是同一列吗?那对我来说一点也不多余,也不是一个完整的外部连接。选择了哪些列?是相同列的两倍吗?两个表中的列?提供的$columnsFromBothTables对于两个查询都完全相同,并且如果两个查询都不生成重复的$columnsFromBothTables,那么是的,这是一个完整的外部联接仿真。在这种情况下,Gordon使用
UNION ALL
为NULL
的方法更好,因为它的作用相同,但对DBMS的工作更少。此查询产生的行可能比需要的行多,甚至是错误的。但是我们当然不能知道。完全外部联接是非常罕见的事情,联接两个不直接相关的表可能会产生人们并不真正感兴趣的组合。举个例子:如果对于帖子,我有一个表包含喜欢和不喜欢,并且我在帖子ID上加入了这两个表,那么我会将每个帖子的喜欢和不喜欢结合起来,即对于5个喜欢和6个不喜欢,我会创建5x6=30个无意义的组合。也许,
UNION
是一种消除非自愿生成的冗余数据的方法。在我的Sqlite查询中,“on”是否等同于“using”?@ericn:
using
是标准SQL和Sqlite中
on
的替代方法。只有当子句中的列在表中具有相同的名称时,才能使用它<因此上的code>更加灵活,因为此限制不适用。
union all
而不是
union
的动机是什么。这和你的笔记“这不会删除重复项——你的代码会这样做”有关系吗?@ericn。对
union
都会减慢查询速度(以删除重复项),并使逻辑不同于
完全联接