SQL加入问题

时间:2009-11-29 17:11:06

标签: sql join

我将使用相同的列连接多个表,无论如何都要设置查询,以便不需要特定的表前缀?

或者我被困在使用select a._id,b._id .... z._id?

9 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

当然,对于SQL Server,您必须指定它以使查询不明确 - 我很害怕被困。

答案 2 :(得分: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无关,那么它会变得更复杂 to table1和table2 id。

  • 许多系统都没有它(例如SQL Server),因此您的代码可移植性较差。

  • 许多人(包括我)更喜欢使用带有列的显式表别名 为了清楚起见并避免以后编辑查询时出错。 我只是使用表中的短别名并使用它。

答案 3 :(得分:2)

我认为这是 Natural Join 的候选人,例如:

SELECT *
FROM   employee NATURAL JOIN department

有关详细信息,请参阅此文章“Basic query operation: the join

引用:

  

NATURAL JOIN关键字指定   那个值为的属性   两个表之间是否匹配   那些名字匹配的人;非常   罕见的例外,这些将是   pk / fk属性,他们必须   有匹配的数据类型(和域)   同样。

警告:根据您的RDBMS,可能支持也可能不支持Natural Join语法。 以下是支持它的一些内容:

答案 4 :(得分: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不必加前缀,因为它在连接中使用。

答案 5 :(得分:0)

一般情况下,是的,你被困在每个重复的列名称中。我假设您不想这样做以避免额外打字;一种方法是使用表别名,即SELECT a.id, b.id FROM mylongtablename a, myotherlongtablename b ...

如果对列名称进行限定确实存在很大问题,那么可以通过定义一个或多个表周围的视图并使用表名的别名来解决这个问题。但是,这只会使查询中的逻辑更难以看到,所以我当然不会推荐它。

长话短说:处理额外输入并为列名添加前缀;它将使您的查询在将来更容易阅读和维护。

答案 6 :(得分:0)

不,我认为你没有办法停止使用你提到的列名或它们的前缀,有一件事是你可以为列名添加别名,但这又对你有用。检查出最佳方法。

答案 7 :(得分:0)

表别名的重要性(从整体上一瞥)

1)如果你必须反复引用表(或视图)(表别名),使用方便的简写符号。它比每次输入完整的表名要容易得多。

e.g。

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)改善代码可重复性

4)假设您有一个派生表,如

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

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

注意: -

列别名为列提供含义全名

e.g。 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关键字是可选的。

希望这能让您了解我们为什么要使用表别名

答案 8 :(得分:0)

您可以使用ON而不是写入列名来保存连接上的一些输入。

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