Java 在不复制SQLite JDBC中的列的情况下实现完全的外部联接效果

Java 在不复制SQLite JDBC中的列的情况下实现完全的外部联接效果,java,sql,sqlite,jdbc,Java,Sql,Sqlite,Jdbc,它可能已经被回答了,但我找不到我要找的东西。这是一个新问题 我试图使用下面的语法在SQLite JDBC中创建完整的外部联接 我尝试的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

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

我试图使用下面的语法在SQLite JDBC中创建完整的外部联接

我尝试的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
SELECT * FROM Table1 
LEFT JOIN Table2 
USING (ID, Name) 
然后,它会生成重复的列(尽管在完全外部联接中也是如此)。但是,最好只获得这些重复列的一个实例,即Union而不重复列

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


任何建议都会有很大帮助。

我认为您可以使用
使用
子句来实现此目的:

SELECT *
FROM table1 LEFT JOIN
     table2 
     USING(ID, Name)
UNION
SELECT *
FROM   table2 LEFT JOIN
       table1
       USING(ID, Name);
请注意,正确的等效项使用的是
union
而不是
union all
,因此消除了重复项。这还假设只有
id
name
列具有通用名称

我通常用于
完全外部联接的方法略有不同:

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);

没有选择除某些列之外的所有列的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
多亏了@Gordon Linoff,我才能够实现我所需要的。 使用

在这里:

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
SELECT * FROM Table1 
LEFT JOIN Table2 
USING (ID, Name) 

这会给我两个表中的所有列,而不会重复重复列。

我想你指的是行,而不是列?如果我不能很好地解释我想要的内容,那么很抱歉,结果会给我两个ID列和两个Name列。所以我这里指的是列,除非我缺少一些基本的SQL概念。你不想手动列出所有列吗?还有很多其他列,写下这些列会很有趣,如果我将来想更改某些内容,可能会很糟糕。这将是潜在错误的根源。我对SQL没有太多的经验,所以可能有另一种方法可以实现我正在尝试的目标,如果你能给我指出正确的方向,那就太好了。如果你真的是指列,除非你手动明确列出列,否则你所要求的是无法实现的。这就是为什么。。名称与ID一样存在于表1和表2中。因此,这两个表都报告名称和ID,因为您使用的是
*
,SQL中除了某些列之外,没有一种方式可以说give me
*
。如果这是MySQL,它会自动删除名称重复的列,只取第一个。MSFT产品不会这样做。
错误:UNION左侧和右侧选择的所有列的结果列数不相同
(因为使用只会删除
*
,而不是
表1.*
)@Gordon Linoff:您的第一个答案很好,只需稍作更改。谢谢我将发布另一个根据您的答案生成的答案。使用语法技巧是一个很好的方向。但是两个查询中列的顺序不同。我首先从表1中获取所有列,然后从表2中获取其余列。另一方面,我并不真正关心列的顺序,因为我根据列名而不是顺序来识别它们。此外,这两个表都包含相同类型的信息,这就是为什么我尝试将它们合并并在单个Excel工作簿表中写出。查询的结果每列只有一个列名(第二个子查询的列名无效)。是的,我明白了你的意思,然后这些列按行重复。简而言之,我甚至不需要UNIONALL,因此也不需要第二个子查询。现在更新答案。