将两个表简单地组合成一个包含两个列的表

时间:2014-06-09 21:56:47

标签: sqlite

有没有办法以1:1的方式组合两个表?似乎JOIN真正做的是在两个表中的行之间创建所有可能的组合,然后使用ON过滤掉不感兴趣的行。但我真正想要的是将两个任意表组合起来:

 a        b         a | b
---   +  ---   =>  ---+---
 1        8         1 | 8
 9        3         9 | 3
 7        4         7 | 4
 5        0         5 | 0

单个表可能由选定的表格组成,也可能是由SELECT / UNION字面值创建的字面值。解决方案不应该依赖于获取两个表的任何特定方式,而是可以假设两个表总是具有相同的行数。

例如,假设第一列可以通过以下方式找到:

SELECT value FROM table ORDER BY x ASC

第二栏可以通过以下方式找到:

SELECT * FROM (SELECT 8 UNION SELECT 3 UNION SELECT 4 UNION SELECT 0),(SELECT 1 UNION SELECT 9 UNION SELECT 7 UNION SELECT 5 as B)

现在,如果我执行此查询:

SELECT * FROM
    (SELECT value FROM table ORDER BY x ASC) AS a,
    (SELECT 1 UNION SELECT 9 UNION SELECT 7 UNION SELECT 5 as B)

我返回每16行,将每个值与每个b值配对,实际上我只想要4行,如上表所示。此外,我想不出一个ON调节器来过滤掉我不想要的行,因为这些表不共享任何共同点。

UNION无效,因为它会将行联合在一起。我想要做的更像是将列合并在一起。

我尝试了以下内容:

SELECT * FROM
    (SELECT value FROM table ORDER BY x ASC) AS a,
    (SELECT 1 UNION SELECT 9 UNION SELECT 7 UNION SELECT 5 as B)
ON
    a.rowid == B.rowid

但是,如果两个子选择都是手动创建的(例如,与第二个子句相同),这似乎只能起作用。

2 个答案:

答案 0 :(得分:1)

您是否看过Stack Overflow的答案:

这个怎么样?"

在OP的帖子中,您从2个具有唯一行的表中提供4行。如果你使用这样的语句:

SELECT 
  t1.a
UNION
  t2.b

它会产生4个独特的行(就像你问的那样)。请参阅此处,了解UNION如何在此示例中为您工作b / c您的2个表中没有重复信息...而UNION ALL将产生8行,一个{ {1}}应该产生4行(仅在这种情况下):

http://en.wikipedia.org/wiki/Set_operations_(SQL)

现在,这可能不适用于其他非唯一行,但这不是您所要求的。

无论如何,我提供的第二个链接为您提供了将一个表转储到另一个表的示例和说明,这实际上是唯一的方法,因为SQL语句将在2个表上以关系方式工作,这就是为什么你有问题。

你基本上试图将两个表没有组合在一起,这两个表之间存在真正的关系,所以你真正想要/需要的是做某种类型的连接...然后再解析他们回到了专栏。在这方面你有几个选择:

  • 最好使用某种ETL工具(或脚本),然后......
  • 或许可以连结成文本文件,
  • 然后使用列连接符重新导入到表中,在连接它们时在列之间设置/注入。

如果没有工具或外部脚本将结果集连接为文本文件,请尝试使用我在上面链接中提供的SQL示例。

答案 1 :(得分:1)

您可以尝试使用ID创建2个临时表,然后根据AUTO INCREMENT字段加入它们。