【问题标题】:SQL: Glue two independent tablesSQL:粘合两个独立的表
【发布时间】:2014-11-21 14:05:52
【问题描述】:

我有两个独立的表:

Emp: id, name, bossid
Data: d_id, d1, d2, d3, d4, d5

我想在 postgreSQL 中创建一个新表:

Goal: id, name, bossid, d_id, d1, d2, d3, d4, d5

什么查询适合?

编辑 结果表

id   |   name   | bossid   | d_id   |   d1   |   d2    |   d3 ...   
-------------------------------------------------------------------
     |          |          |        |        |         |

EDIT2 Goal 表将包含来自Emp 的所有记录以及来自Data 的相同数量的记录。所以它就像LEFT JOIN 但我没有ON 条件,因为表格不相关。

【问题讨论】:

  • 你可以使用joincreate table as select
  • 你想创建一个新表,还是一个物化视图?
  • 这些表之间是否存在关系?
  • 表之间没有关系。我想创建一个新表,它将 EmpData 中的所有列作为自己的列。
  • 如果两个表不相关,你还需要定义Data中的行。如果不出意外,请说“任意行” - 这与“随机行”不同......

标签: sql postgresql join union


【解决方案1】:

您可以使用交叉联接,但这可能会产生不希望的结果,具体取决于您的需要。

CREATE TABLE Goal AS
    SELECT *
    FROM Emp CROSS JOIN Data

【讨论】:

  • 您可以简化查询,用* 替换所有列,但这没关系
  • 嗯,我想避免像cathesian产品中那样的重复。
  • @Szczepan 为了避免重复,你的表之间必须有父关系,否则这是不可能的
  • @Aramillo Ohh 如果我们假设父关系,那么这样的查询会是什么样子?
  • @Szczepan 如果您有关系,您将使用inner join 加入两个表,您的问题将得到解决
【解决方案2】:
CREATE TABLE result AS
SELECT e.*, d.*
FROM  emp e
LEFT  JOIN (SELECT * FROM data LIMIT 1) d ON TRUE

这完全符合您的要求。
由于缺乏定义,我采用了 最便宜 的解决方案,从 Data 中选择任意一行添加到 Emp 中的每一行。

结果表包含来自Emp 的所有行,无论Data 中的行数如何,甚至可以为空。

从辅助表中追加一个 DISTINCT 任意行:

CREATE TABLE result AS
SELECT id, name, bossid, d_id, d1, d2, d3, d4, d5
FROM        (SELECT *, row_number() OVER () AS rn FROM emp) e
LEFT   JOIN (SELECT *, row_number() OVER () AS rn FROM data) d USING (rn)

与上面相同,但附加了来自Data 的任意不同行。同样,适用于 Data 中的 0-n 行。

Data行数的影响:

  • 0 rows in Data:结果中表示的所有行; Data 的列中的所有行都为 NULL。
  • 少于Emp:结果中表示的所有行;来自Emp 的多余行在来自Data 的列中具有NULL。
  • 行数相等:结果中表示的所有行;没有额外的 NULL 值。
  • 超过Emp:来自Data 的任意多余行丢失;没有额外的 NULL 值。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2013-09-26
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2017-12-09
    • 1970-01-01
    相关资源
    最近更新 更多