Sql 如何在连接两个表时删除一个连接键

Sql 如何在连接两个表时删除一个连接键,sql,postgresql,join,Sql,Postgresql,Join,我有两张桌子。两者都有很多列。现在我有一个名为ID的公共列,我将加入它 既然这个变量ID存在于两个表中,如果我这么做的话 select a.*,b.* from table_a as a left join table_b as b on a.id=b.id 这将给出一个错误,因为id是重复的(出现在两个表中,并且都包含在内) 我不想在select语句中分别写下b的每一列。我有很多专栏,这很痛苦。我可以在join语句中重命名b的ID列,类似于SAS数据合并语句吗 我正在使用Postgres。对

我有两张桌子。两者都有很多列。现在我有一个名为ID的公共列,我将加入它

既然这个变量ID存在于两个表中,如果我这么做的话

select a.*,b.*
from table_a as a
left join table_b as b on a.id=b.id
这将给出一个错误,因为
id
是重复的(出现在两个表中,并且都包含在内)

我不想在select语句中分别写下
b
的每一列。我有很多专栏,这很痛苦。我可以在join语句中重命名b的ID列,类似于SAS数据合并语句吗

我正在使用Postgres。

对于重复的输出列名,Postgres不会给出错误,但有些客户端会这样做。(重复的名称也不是很有用。)

无论哪种方式,都可以使用
USING
子句作为联接条件,将两个联接列合并为一个:

SELECT *
FROM  tbl_a  a
LEFT  JOIN tbl_b b USING (id);
当您连接同一个表(自连接)时,将有更多重复的列名。这个问题一开始就毫无意义。这对于不同的表开始有意义了。就像你在问题开头所说的:
我有两个表…

为了避免所有重复的列名,您必须在
SELECT
子句中明确列出它们-可能需要处理列别名以获得两个具有不同名称的实例

或者您可以使用一个
自然的
连接-如果它适合您无法解释的用例:

SELECT *
FROM  tbl_a  a
NATURAL LEFT JOIN tbl_b b;
这将连接共享相同名称的所有列并自动折叠这些列-与使用子句在
中列出所有公共列名完全相同。您需要了解可能为空值的规则


不确定postgreSQL对using做了什么,但是如果使用using子句进行连接,例如:从左连接b using(id),连接应该只有一个列id。我相信Oracle会这样做,所以您说using不会给出错误,因为这两个列都包含在内?不,没有。刚刚检查过。只是猜测一下,因为连接只有一个列id,而不是两个列,a.id和b.id可以在SQLFIDLE中尝试一下:我使用了,但选择了a.*和b.*,它给出了相同的结果error@Manish:使用
选择a.*,b.*
您将指示Postgres输出列两次。也。。我在上面添加了更多内容。@Manish:如果使用
SELECT*
USING
,公共字段(本例中为ID)将被合并,结果集中只有一个
ID
。(这也是为什么在许多表中使用公共字段名(如
ID
)是个坏主意的原因。最好使用构造字段名,如
ID\u TBL\u a
ID\u TBL\u B
等)。祝你好运。