2012-10-22 61 views
0

我有一個類別名稱與category_parent = id相關的簡單表。我需要選擇沒有孩子的記錄。選擇沒有自我加入關係的父母

從其他答案我已經拼湊起來的這樣一句話:

SELECT cat.category_name AS 'Child Name', cat.id AS 'Child ID', 
cat.category_parent AS 'Childs Parent', cat_par.category_name AS 'Parent Name', 
cat_par.id AS 'Parent ID' 
FROM category AS cat 
LEFT JOIN category AS cat_par ON cat.category_parent = cat_par.id 
WHERE cat_par.id IS NULL; 

這將成功地選擇一些沒有父記錄。我試圖將最後一項更改爲WHERE cat.category_parent IS NULL,但是這個結果還是空的。

我也曾嘗試基於另一個答案這樣的說法:

SELECT cat.category_name AS 'Child Name', cat.id AS 'Child ID', 
cat.category_parent AS 'Childs Parent' cat_par.category_name AS 'Parent Name', 
cat_par.id AS 'Parent ID' 
FROM category AS cat 
WHERE NOT EXISTS 
(SELECT id FROM category AS cat_par WHERE cat.category_parent = cat_par.id); 

返回錯誤No value given for one or more required parameters.

+0

你爲什麼在'cat.category_parent IS NULL'中的哪個地方重新開始的原因是什麼?其中第一個查詢已經在工作? –

+0

第一個查詢用於找到沒有孩子的父母,但沒有找到沒有父母的孩子。我認爲改變最後的WHERE會做到這一點。 – Nelluk

+0

你是否只需要沒有孩子的記錄的id和category_name,還是你還需要他們的父母名字? – fthiella

回答

0

如果你只需要無子女的ID和記錄的類別名稱,這也適用:

SELECT 
    category.id, 
    category.category_name 
FROM 
    category LEFT JOIN category AS category_1 
    ON category.id = category_1.category_parent 
WHERE 
    category_1.category_parent IS NULL 

,我認爲這個查詢看起來不錯。但是,如果你還需要父母的名字,你可以使用這個:

SELECT 
    category.id, 
    category.category_name, 
    category_1.category_name 
FROM 
    (category LEFT JOIN category AS category_2 
    ON category.id = category_2.category_parent) 
    LEFT JOIN category AS category_1 
    ON category.category_parent = category_1.ID 
WHERE 
    category_2.category_parent Is Null; 

,是的,它變得有點複雜:它只是一個很好的SQL的工作,但我寧願使用EXISTS的替代版本。

+0

謝謝。您的頂級查詢與我正在嘗試編寫的查詢最爲匹配,並且還執行了我嘗試運行的其他答案中最快的查詢。 – Nelluk

1

我想我明白的關係就好了。這個怎麼樣?

SELECT cat.* 
FROM category cat 
WHERE cat.id not in (
    SELECT distinct category_parent FROM category 
); 
+0

它看起來像我的設置(很不幸是一個.mdb訪問文件)有像「SELECT distinct category_parent FROM category」這樣的行出現問題。這是我第二次嘗試運行一個類似的語句查詢和兩次它已經被凍結,並有一個進程需要被殺死 – Nelluk

+1

@ user1281743它是MS Access是一個相當重要的細節忽略... – UnhandledExcepSean

+0

這當我讓它運行的時候最終會工作。耗時約400秒。感謝和遺憾的遺漏。 – Nelluk

2
Select p.id, p.category_name 
From category As p 
Where Not Exists (
    Select 'x' 
    From Category c 
    Where c.category_parent = p.id 
) 
0

與第二查詢的問題是,你正試圖在您的結果集cat_par.category_name,即使它不是在你的FROM條款。您不能從EXISTS子查詢中的表中返回列。

你想以下幾點:

SELECT 
    cat.category_name AS 'Child Name', 
    cat.id AS 'Child ID', 
    cat.category_parent AS 'Childs Parent', 
    cat_par.category_name AS 'Parent Name', 
    cat_par.id AS 'Parent ID' 
FROM 
    category AS cat 
    LEFT JOIN category AS cat_par ON cat.category_parent = cat_par.id 
WHERE 
    NOT EXISTS 
    (SELECT 
     NULL 
    FROM 
     category AS cat_childless 
    WHERE cat.id = cat_childless.category_parent);