2009-11-29 54 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語法可能會也可能不會被支持。 這裏有一些不支持它: