2009-11-29 53 views
2

我将加入多个表中的所有列都相同,是否有设置查询,以便不需要特定的表前缀?SQL加入问题

或者我陷入使用select a._id,b._id .... z._id?

+5

困?没有它,你的查询就会模糊不清,难以调试,而且难以让其他人跟随。如果我有足够的表让输入变得很痛苦,我会编写一些代码来为我生成SQL。除非你通过Twitter传递SQL,否则长度并不是真正的问题。 – MartW 2009-11-29 17:34:18

+1

国际海事组织,任何时候你加入你应该在查询中的所有字段前加上他们来自的表别名。这极大地提高了可读性和可维护性。 – Donnie 2009-11-29 17:57:29

+1

当你在C/C++/C#/ Java /等中有2个对象实例时,你必须引用特定的实例 - SQL没有什么不同。表别名一直很好用。 – 2009-11-29 19:36:06

回答

3

当然,对于SQL Server,您必须指定它以便查询不含糊 - 陷入困境。

5

否。如果列的名称相同,则数据库软件需要能够以某种方式区分它们。

1

在标准的SQL中,你必须在你的列的前面。

虽然其他SQL方言可能会提供此功能。例如,在Postgresql中:

create table t1(id integer not null, t1 text not null); 
create table t2(id integer not null, t2 text not null); 

select id, t1, t2 from t1 join t2 using (id); 

在这里,id不必作为前缀,因为它在连接中使用。

0

一般来说,是的,你坚持限定每个重复的列名。我假设你不想这样做,以避免额外的打字;一种方法是通过使用表别名,即SELECT a.id, b.id FROM mylongtablename a, myotherlongtablename b ...

如果确实是一个问题限定列名称的大问题,您可以随时通过定义一个视图围绕一个或多个表来使用别名表名。但是,这只会让查询中的逻辑更难以看清,所以我当然不会推荐它。

长话短说:处理额外的输入和前缀列名;它会使您的查询在未来更易于阅读和维护。

2

在某些RDBMS(例如Oracle)中,您可以使用JOIN ... USING ...表单。 例如:

select id, col1, col2 from table1 a join table2 b using (id) 

几乎等效的:

select a.id, col1, col2 from table1 a join table2 b on a.id = b.id 

但:

  • JOIN ... USING行为不同于JOIN ... ON ...。 最重要的是你不能在使用()内部的列中使用显式前缀。

    在上面的例子中,你不能使用a.id或b.id. 因此,如果您的第三个表的列ID与表1和表2的ID不相关 可能会变得更加复杂。

  • 许多系统都没有它(例如SQL Server),因此您的代码便携性会降低。

  • 许多人(包括我)更喜欢使用带有列 的明确表别名,以避免以后编辑查询时出现错误。 我只是使用简短的别名表并与它一起生活。

0

不,我不认为有什么办法,通过它可以阻止你提到使用列名或它们的前缀,有一件事是你可以别名的列名,但同样这是给你的更多的工作。检查最好的出路。表别名的

0

重要性(从整体窥见)

1)的速记是得心应手,如果你要引用表(或视图)一次又一次(表别名)。这比每次输入完整的表名要容易得多。

例如

select tableA.col1 , tableA.Col2,tableB.Col1,tableC.Col2 
from tableA 
join tableB 
on tableA.id = tableB.id 
join tableC 
on tableC.id = tableB.id 
and tableC.id = tableA.id 

可改述为

select a.col1 , a.Col2,b.Col1,c.Col2 
from tableA a 
join tableB b 
on a.id = b.id 
join tableC c 
on c.id = b.id 
and c.id = a.id 

2)移除列名

3)的模糊性提高代码redeability

4)假设有一个派生表等

SELECT col1,col2 
FROM (select * 
     from mytable 
     where col3 = 'somevalue') x 

在这种情况下,别名是必须的

注: -

列别名给人一种意义全名列

例如select avg(col1) from mytable

其给出的输出作为

[No Column Name] 
----------------- 
30 

可以通过

select avg(col1) "Average" from mytable 

select avg(col1) AS "Average" from mytable 

输出来美化:

Avegare 
------------- 
30 

但是,AS关键字是可选的。

希望这可以让您了解,为什么我们应该用表的别名

0

去可以节省一点打字上的通过使用,而不是写列名加入。

SELECT a._id, b._id FROM table1 a JOIN table2 b 
ON _id 
2

这看起来对我来说,为Natural Join E中的候选人。G:

SELECT * 
FROM employee NATURAL JOIN department 

欲了解更多详细信息,请参阅本文“Basic query operation: the join

报价:

自然连接关键字指定 是其值将 两个表之间匹配的属性 那些匹配的名字;很少有例外,这些将是 pk/fk属性,并且它们必须具有匹配的数据类型(和域) 以及 也具有匹配的数据类型(和域) 。

警告:根据您的RDBMS,Natural Join语法可能会也可能不会被支持。 这里有一些不支持它: