2014-02-19 56 views
0

我有幾個問題,關於自我加入,任何人都可以幫忙解答一下?什麼是sef-join?

  1. 是否有嚴格的自連接格式?有sample這樣的:

    SELECT a.column_name, b.column_name... 
    FROM table1 a, table1 b 
    WHERE a.common_field = b.common_field; 
    

但也有樣:

SELECT a.ID, b.NAME, a.SALARY 
    FROM CUSTOMERS a, CUSTOMERS b 
    WHERE a.SALARY < b.SALARY; 

不知是必要的連接(a.common_field = b.common_field)?因爲這兩種格式都是自加入的。

如何將自聯接進行優化?他們將被視爲INNER JOIN或CROSS JOIN?特別是對於第二種格式,它是自交叉連接嗎?在SQLite和PostgreSQL中,它們是以相同的方式處理的嗎?

我的問題是我想提取從一堆圖形類數據的結構和我的查詢像

SELECT A.colum, B.colum,....N.colum 
    FROM 
    table1 as A, table1 as B, table1 as C .... table2 as M, table2 as N .... 
    where 
    A.colum1<B.colum1 and 
    C.colum1=D.colum1 and 
    .... 

在查詢中,表1,表2 ......是單列的表,他們是最終結構的組成部分。這種自連接格式最適合我的問題嗎?我發現它在PostgreSQL中非常慢,但在SQLite中很快,這讓我感到困惑。

回答

2

自加盟就結構/行爲而言,它與任何其他連接沒有區別,但它們通常以不同的方式使用。

你應該溝逗號過時的語法分隔的表列表並使用ANSI聯接:

SELECT a.column_name, b.column_name... 
FROM table1 a 
JOIN table1 b 
ON a.common_field = b.common_field; 

你可以指定你希望它是(JOINLEFT JOINRIGHT JOINCROSS JOIN什麼類型的JOIN .. ),以及如何將這些表彼此關聯,就像其他任何連接一樣。如您在a.Salary < b.Salary示例中指出的那樣,不需要等效。

+0

無需使用同一列的兩個表的,視情況而定。看我的例子。 – jean

+0

對於我的第二種格式,它是自交叉連接嗎?就好像它是,當有很多表時,計算將變得非常複雜。我有一個類似的例子,它在SQLite中運行速度很快,但在PostgreSQL中非常緩慢。 – user3329081

+0

@ user3329081你可以這樣想,對我來說'CROSS JOIN'意味着一個無限的關係,一個完整的笛卡爾產品,在這個例子中,你並沒有將每條記錄都加入到其他記錄中,產品。 –

0

沒有,有沒有這樣的事情。

自聯接是與自身連接的表只是一個特例。想想看,像參加同一事物的兩個實例(其實是沒有用兩個實例,但兩個引用)

一般來說,你生病的內在自我加入,但你可以CROSS JOIN或outter加入表本身。

例子:

select * from tbPeople p0 
join tbPeople p1 on p1.id = p0.parentId 
where p0.id = you 

返回你和你的父母

select * from tbPeople p0 
left join tbPeople p1 on p1.parentId = p0.id 
where p0.id = you 

返回你的孩子,或者只是你的情況下,你沒有後代尚未

相關問題