我有许多相同长度(行数)的表,这些表以前在写入磁盘时按某些列排序。
我SELECT
的形式是:
SELECT t1.id, t1.value, t2.value, t3.value, ...
FROM t1 LEFT JOIN t2 ON t1.id=t2.id
LEFT JOIN t3 ON t1.id=t3.id
...
我知道这些表是如何填充的,这个结果完全对应于简单的列绑定,因此ON t1.id=t2.id
可以ON t1.id=t3.id
省略。问题是,据我所知,RDBMS 只能操作投影和行绑定。列绑定不是典型的操作。
所以问题如下:是否可以在不指定任何连接条件的情况下“按原样”绑定列?例如,以下语法错误的查询应该解释我的意思:
SELECT t1.id, t1.value, t2.value, t3.value, ...
FROM t1 COLUMN_BIND t2 COLUMN_BIND t3 ...
我正在使用 PostgreSQL 9.4.5。
数据示例
输入表:
t1.id | t1.value
----------------
1 | a
2 | a
3 | b
4 | a
5 | c
6 | a
t2.id | t2.value
----------------
1 | g
2 | g
3 | h
4 | g
5 | o
6 | l
t3.id | t3.value
----------------
1 | e
2 | e
3 | e
4 | e
5 | q
6 | e
预期结果:
t1.id | t1.value | t2.value | t3.value
--------------------------------------
1 | a | g | e
2 | a | g | e
3 | b | h | e
4 | a | g | e
5 | c | o | q
6 | a | l | e
对我来说,这看起来像是一个非常典型的连接:
RDBMS 的表中没有自然顺序。表是没有逻辑顺序的集合。所以你的问题是合乎逻辑的废话:
..因为“原样”在 RDBMS 表的上下文中没有意义。
此外,无条件连接是
CROSS JOIN
SQL 中的一种,它产生笛卡尔积。也就是说,行必须以某种物理顺序存储。这是一个无法依赖的实现细节,并且可以随时更改,而不会在后台进行任何写入操作发出警告。但它就在那里,你甚至可以通过查看Postgres中的系统列来看到它。 如果要捕获行的当前物理顺序,这通常有效:
ctid
即:具有空
OVER
子句的窗口函数,通常在简单查询中按物理顺序顺序读取行。您可以为每个表执行此操作并加入计算
rn
列。但是由于您已经有一个id
用于相同目的的列,这将是完全没有意义的。如果保证所有涉及的表都具有完全相同的一组
id
值,那么您不妨[INNER] JOIN
:如果任何表可能有缺失或重复的
id
值,您需要相应地调整,具体取决于您想要实现的目标。例如,如果在每个表中
id
都是唯一的,但某些id
值可能不会出现在每个表中,则最好的查询是FULL [OUTER] JOIN
保留所有行:另外:您可能对并行取消嵌套数组的相关概念感兴趣:
不确定我是否理解您的要求,但
NATURAL JOIN
可能是您正在寻找的内容:属性的名称用于确定连接条件。我个人认为自然连接很危险,因为某些属性可能被命名为相同而彼此没有任何关系。
而不是
NATURAL JOIN
我更喜欢REFERENTIAL JOIN
使用外键来确定表之间的关系。据我所知,任何标准文档中都没有提到这种连接类型,我认为它没有在任何 DBMS 中实现。