用 SQL 結果集作為條件繼續查詢同乙個資料表,能否只用一條 SQL 語句實現?

時間 2021-05-31 15:32:33

1樓:RednaxelaFX

挖個老問題。這種樹形結構,如果要查詢的是某顆子樹的資料,那就是recursive CTE(common table expression)的最經典的使用場景。MySQL一直沒支援recursive CTE,但最近終於在MySQL 8系列裡有實驗性的實現了:

MySQL 8.0 Labs: [Recursive] Common Table Expressions in MySQL (CTEs),而以前的話一種寫法是手寫儲存過程來模擬:

但題主問的問題是「找出所有葉子節點」,就不是乙個針對特定子樹、而是這個表自己對自己的anti join,所以就不需要recursive CTE這麼高階的貨。所以現有的兩個回答所給出的同樣的解就是正解。對這樣的表結構:

create

table

dirs(id

integer

,parent

integer

)帶有anti join語句的查詢:

select

*from

dirs

awhere

notexists

(select

1from

dirs

bwherea.

id=b.

parent

)就正好 >_<

2樓:mysqlops

select * from table a where not exists (select 1 from table b where a.id = b.parent) 推薦

而不建議使用子查詢

對於子查詢不推薦使用....MySQL對子查詢的支援雖然由不支援到支援,後又改進子查詢的優化器,但是依然效果不太好....而且子查詢也會有其缺點...

3樓:

select * from table a where not exists (select 1 from table b where a.id = b.parent)

用SQL 做資料清洗與用Python做資料清洗的利弊分別是什麼?哪種方法處理更簡單?

無冕之王 SQL要自己寫演算法,python有很多比較成熟的演算法,拿過來用就可以,至於哪種更簡單就要看你這兩種工具哪種用得更得心應手了。 ZhiHu上的提問者 這必須要看具體的應用場景。SQL最大的弊端是只能單語句執行。而Python的優勢是可以解決SQL的弊端。尤其是對於需要重複操作的相同資料集...

mysql結果集加序號問題?

Robin 首先給出解決方案 通過乙個初始值為0的變數 rownum,依次遞增1來實現行號SELECT rownum rownum 1 ASrownum name FROM temp,SELECT rownum 0 temp WHERE rownum 4 給出一般性的語句 SELECT rownum...

SQL 語句的查詢結果的的順序是由哪些因素決定

What is the default Order By of queries?SQL best practice to deal with default sort order MySQL row order for SELECT FROM table name mysqlops LZ的這個SQL...