Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql-在不复制密钥的情况下连接_Sql_Postgresql - Fatal编程技术网

sql-在不复制密钥的情况下连接

sql-在不复制密钥的情况下连接,sql,postgresql,Sql,Postgresql,我想连接两个具有数百列的表,如下所示: select * from a, b where a.key = b.key 问题是我得到了一张桌子 Key | Key | Row1 | etc... 在不显式命名所有列的情况下(select a.key,row1,…from a,b其中a.key=b.key),是否有办法限制查询,使其仅返回其中一个键?也许自然连接是您的解决方案: SELECT * FROM a NATURAL JOIN b; 但是,如果有更多重复的键名,并且您希望在结果中同时使

我想连接两个具有数百列的表,如下所示:

select * from a, b where a.key = b.key
问题是我得到了一张桌子

Key | Key | Row1 | etc...

在不显式命名所有列的情况下(
select a.key,row1,…from a,b其中a.key=b.key
),是否有办法限制查询,使其仅返回其中一个键?

也许自然连接是您的解决方案:

SELECT * FROM a NATURAL JOIN b;

但是,如果有更多重复的键名,并且您希望在结果中同时使用这两个键,那么自然联接对您来说是不好的。

如果您专门命名字段而不是*,您将不会有重复的键,并且查询将更快(我听说)


USING语句会导致键在结果中只显示一次。

不,您不能,您需要指定所需的列,如果您只需要
b
中的数据,则可以执行
a.key,b.*
@rs。啊,这就解决了。Hiro2k的回答似乎与你的第一句话相矛盾;然而,就我而言,你的解决方案似乎是最好的。谢谢大家!+谢谢你教我新东西。根据维基百科的说法:“大多数专家都认为自然连接是危险的,因此强烈反对使用自然连接。”可能会用“使用”的说法。一开始我误解了这个问题。我以为您想删除所有重复的密钥名。我同意,自然连接是危险的,不应该使用。谢谢你,这似乎解决了我问的问题。我还有一个问题,我的键不匹配:我必须取其中一个键的子串。是否存在允许子字符串(key1)=key2的语法?这是糟糕设计的标志。表中的键应该100%匹配。如果您想这样做,可以使用USING子句,但不能使用USING子句。您必须更改为使用ON子句,但随后重复项再次出现。@Hiro2k这是DB圈子中一个非常激烈的争论问题。我个人认为,
使用
作为连接条件是一种可怕的错误特性,它会导致脆弱的SQL。真正的解决办法是不要在生产代码中使用
SELECT*
——始终明确地列出列,不要失败。这可以防止列被添加/重新排序,并有助于大多数数据库中的解析器也给出更多有用的错误消息。哎呀,对不起,我说的是
NATURAL JOIN
是一种“可怕的错误特性”,而不是
使用
。晚上在这里太晚了,我的错<代码>使用(x)
的内部连接b很好,这只是一种更简洁的方式,在(a.x=b.x)
上编写内部连接b,将结果中的相等列折叠为一列。这不会使我所知道的任何健全数据库上的查询速度更快,除非您实际上只需要一小部分列。即使如此,只有当省略的列非常大(即:降低向客户端传输数据的成本)或使用PostgreSQL的
TOAST
等机制从主元组中存储时,它才有帮助,因此可以完全跳过对大列的提取。@canisrufus“几百列”可能是您的问题的一部分;-)但我知道干净漂亮的设计并不总是能很好地满足现实世界的性能要求。根据情况,您可能需要考虑一个键/值扩展类型,如PostgreSQL的“代码> HSturt<代码>,或者甚至是颤抖的EAV设计。使用<代码>选择*<代码>,在第一次添加一列或更糟的时候,你会讨厌自己——在中间插入一个。
select key, field1, field2, field3 from a, b where a.key = b.key
select * from a INNER JOIN b USING (key)