在SQLite JDBC中实现完全外连接效果而不复制列

时间:2014-08-28 13:40:02

标签: java sql sqlite jdbc

它可能已经得到了解答,但我找不到我想要的东西。这是一个新问题。

我正在尝试使用以下语法在SQLite JDBC中创建Full OUTER JOIN。

我试过的SQLite查询:

SELECT table1.*, table2.*
FROM   table1 
LEFT JOIN table2 
ON table1.ID = table2.ID
AND
table1.Name = table2.Name
UNION ALL
SELECT table1.*, table2.*
FROM   table2
LEFT JOIN table1
ON table1.ID = table2.ID
AND
table1.Name = table2.Name

然后它会产生重复的列(如在Full Outer Join中所预期的那样)。但是,只获得那些重复列的一个实例,即没有重复列的Union,这将是很好的。

更多说明:我需要的是从两个表中获取所有列,但重复重复的列。

任何建议都会有所帮助。

3 个答案:

答案 0 :(得分:1)

我认为您可以为此目的使用using子句:

SELECT *
FROM table1 LEFT JOIN
     table2 
     USING(ID, Name)
UNION
SELECT *
FROM   table2 LEFT JOIN
       table1
       USING(ID, Name);

请注意,正确的等效项使用union而不是union all,因此会删除重复项。这也假设只有具有通用名称的列为idname

我通常用于full outer join的方法略有不同:

select *
from (select id, name from table1 union
      select id, name from table2
     ) driver left join
     table1
     using (id, name) left join
     table2
     using (id, name);

答案 1 :(得分:1)

没有SQL语法可以选择除某些列

之外的所有列
select * except id, name -- can't do this

您必须明确命名其中一个表的所有其他列:

SELECT table1.*, table2.col1, table2.col2, table2.col3 -- etc 
FROM table1 
LEFT JOIN table2 
  ON table1.ID = table2.ID
  AND table1.Name = table2.Name
UNION ALL
SELECT table1.*, table2.col1, table2.col2, table2.col3 -- etc 
FROM table2
LEFT JOIN table1
  ON table1.ID = table2.ID
  AND table1.Name = table2.Name

答案 2 :(得分:0)

感谢@Gordon Linoff answer,我能够完全达到我所需要的水平。 缺少神奇的语法 USING

这是:

SELECT * FROM Table1 
LEFT JOIN Table2 
USING (ID, Name) 

这确实为我提供了两个表中的所有列,而不重复重复的列。