2013-02-16 47 views
0

我從來沒有檢查過這樣的事情,所以我希望你們都可以幫忙。我不確定是否最好創建一個臨時表,然後檢查一個項是否在其中或者是否有更好的方法。這個SQL查詢應該如何構建? (Postgres)

表中的每一行代表一個可能有父項的對象。父級存儲在同一個表中。在這個例子中,parent_id字段保存了行父節點的主鍵。我試圖選擇表中所有具有設置爲特定值的類型列和其父行在field_b列中具有'z'的行。括號中的部分顯然需要工作...

SELECT s_id, s_text, s_parent_id 
FROM sections 
WHERE s_derivedtype >= 10000 AND 

如果返回任何

SELECT s_id 
FROM sections 
WHERE s_id = {the s_parent_id from the first query) AND s_flags LIKE '%z%' 

我這個更新,希望更易於閱讀...

什麼是最有效的如何做到這一點?我預計在桌子18米之外會有100k排的東西回來,所以體面的表現並不重要。

+0

提供架構和小集合數據。例如:「在PARENT_ID領域擁有行的父級的主鍵」聽起來有點混亂。這是某種形式的EAV,還是隻是被解釋得笨拙? – 2013-02-16 23:08:29

+0

(我相信你只是想自我加入,就像'FROM table1 AS c JOIN table1 AS p ON c.parent_id = p.id',但我今天沒有猜測心情。) – 2013-02-16 23:10:10

+0

這可能是在正確的軌道上。我沒有發佈完整的模式,但希望能夠讓我的問題更清楚一些。 – thatthatisis 2013-02-16 23:18:01

回答

1

嘗試

SELECT t1.key_field, t1.field_a 
FROM tbl AS t1 
WHERE t1.type = 1 AND parent_id = (SELECT t2.id FROM tbl AS t2 
            WHERE t2.id = t1.parent_id 
             AND t2.field_b LIKE '%z%') 

SELECT t1.key_field, t1.field_a 
FROM tbl AS t1 
INNER JOIN tbl AS t2 ON t2.id = t1.parent_id 
WHERE t1.type = 1 
AND t2.field_b LIKE '%z%' 
+0

原來這是子查詢的一個體面的例子。感謝TI。 – thatthatisis 2013-02-16 23:38:37

2
SELECT key_field, field_a 
FROM 
    t s 
    inner join 
    t p on p.key_field = s.key_field 
WHERE 
    s.type = 1 
    AND p.field_b LIKE '%z%'