2014-05-16 12 views
-1

比方說,我有一個名爲實體具有以下列的表:
ID | flag | foreignKey | parentEntityId過濾選擇與參加同一個表

其它指出

  • 沒有這些字段可以爲NULL
  • parentEntityId!= 0,你可以肯定的是FOREIGNKEY也有一個價值!= 0(反之亦然)

我有以下約束收集一些數據:

  • FOREIGNKEY必須等於0 [容易:D]
  • 標誌必須等於0 OR(比方說15)[easy :p]
  • id must不能在其他行的parentEntityId領域:/?]引用

我沒使用自我滿足最後一個約束加入

-- I Finally ended up with a sub-query (which returns what I need) : 
SELECT e.* 
FROM entity e 
WHERE e.flag='15' 
-- gathering entities ids where foreignKey has a specific value 
AND e.id NOT IN 
    (SELECT GROUP_CONCAT(DISTINCT CONVERT(parentId , CHAR(8)) SEPARATOR ",") 
    FROM entity where foreignKey='10' 
    GROUP BY id 
); 

我的問題是..這可以通過「自我加入」表達來實現嗎?

+0

5月downvoters解釋爲什麼? – Stphane

回答

2

像這樣的東西(在文本的條件):

select e.* 
from entity e 
where e.foreignKey = 0 and 
     e.flag in (0, 15) and 
     not exists (select 1 from entity e2 where e2.parentid = e.id); 
0

我覺得你讓它太複雜了。 爲什麼你不使用這樣一個簡單的查詢?

SELECT e.* 
FROM entity e 
WHERE e.flag='15' 
AND e.parentEntityId NOT IN 
    (SELECT DISTINCT id FROM entity e 
); 

您以這種方式過濾掉所有的子實體。

+1

我不確定這會帶來什麼樣的表現,但嚴格來說,把一個明顯的「不在」是無用的。無論如何,無論它在次選中的次數多少,都不會排除該ID。 – paqogomez

2

這是你的自連接方法,也稱爲反連接在這種情況下:

SELECT e1.* 
FROM entity e1 
LEFT JOIN entity e2 
    ON e2.parentEntityId = e1.id 
WHERE e1.flag = 15 
    AND e1.foreignKey = 0 
    AND e2.id IS NULL 

你不」您不必擔心有多少記錄匹配parentEntityId,因爲它是反連接(您排除了任何具有匹配的記錄)。

+0

謝謝你回答_問題_ – Stphane