2017-09-25 43 views
0

我有要求我加入/指同一表的查詢,但是,我無法使用查詢得到的結果。SQL指同一個表中查詢滯留

下面是我的查詢的樣本

SELECT a."column1", b."column1" as anotherColumn 
FROM table1 AS a, table2 AS b 
where a.'x' = b.'x' 
AND NOT a.'y' = b.'y' 

這個查詢需要永遠載入。但是,如果我只是運行:

SELECT a."column1" 
FROM table1 AS A 

它只需要14秒。

我目前使用PostgreSQL與pgAdmin的。目前table1有140萬張表。

是不是因爲是在表1中的鎖時,它是第一個被稱爲?

編輯:每一行包含「作者」,「書出版」的記錄,在這種情況下,有可能是一本書,因此是合作者許多作者。我試圖實現是要找出合作者的數量每個作者

+0

第一個查詢沒有加入這兩個表。您正在創建這兩個表格之間的笛卡爾產品(又稱「交叉連接」)。爲什麼? –

+0

@a_horse_with_no_name我編輯了我的問題,希望能夠澄清我正在努力實現的目標。感謝讓我知道它實際上正在交叉加入 – Jackelll

+0

@fukanchik我添加了WHERE子句,我認爲你的意思是我的子查詢?我在我的問題中添加了更多細節,希望能夠澄清一些觀點。有沒有辦法在沒有這種連接的情況下生成「協作者」結果? – Jackelll

回答

0

我所試圖實現的是找出合作者的數量每個作者

像這樣的算上作者的數量,我想在那裏,這個數字大於1,合作者的數量是這個數字 - 1

select b.name, count(a.*)-1 as num_collaborators 
from books b 
inner join authors a on b.id = a.book_id 
group by b.name 
having count(a.*) > 1 

 

--original 
SELECT a."column1", b."column1" as anotherColumn 
FROM table1 AS a, table2 AS b 
; 

--amended 
SELECT a."column1", b."column1" as anotherColumn 
FROM table1 AS a, table2 AS b 
where a.'x' = b.'x' 
AND NOT a.'y' = b.'y' 

25年前 ANSI標準SQL引入了更多的「明確的」語法連接和使用本是公認的「最佳實踐」了。

這種「顯式連接語法」的最大好處之一是,意外忘記正確連接變得不可能,不像原來的查詢中忘記了連接謂詞。 (&當這種情況發生的意外笛卡爾乘積產生。)

所以,我建議你使用表名之間用逗號停止。採取這一簡單步驟將有助於您使用更好的連接語法。