假设有这样的table。
1.表t0
| 用户标识|名称|
| --|--|
| 100 |'a'|
| 101 |'B'|
| 102 |'C'|
1.表t1
| ID|用户标识|
| --|--|
| 1 | 100 |
| 8 | 101 |
| 9 | 102 |
1.表t2
| ID|标志|
| --|--|
| 1 | 0 |
| 8 | 0 |
| 9 | 1 |
1.表t3
| ID|基ID|标志|
| --|--|--|
| 2 | 1 | 1 |
| 5 | 1 | 0 |
| 5 | 2 | 0 |
1.表t4
| ID|基ID|标志|
| --|--|--|
| 3 | 2 | 1 |
| 4 | 2 | 1 |
| 6 | 5 | 0 |
| 7 | 5 | 1 |
我想知道所有标志为1的数据的名称。t3是t2的子表,t4是t3的子表。如果超级表的数据的标志是1,则子表的标志也是1,但反之则不然。
在本例中,我这样编写查询语句。
select t1.id, t0.name from t0 join t1 on t0.user_id = t1.id where t1.id in
(select id from t2 where flag = 1
union
select base_id from t3 where flag = 1 or id in
(select base_id from t4 where flag = 1)
)
;
我认为我的查询不够好,我认为有一个更好的方法来完成这项任务,比如使用join等来减少深度。但我不知道该怎么做……
帮帮我...还有更好的办法吗?
3条答案
按热度按时间fzsnzjdm1#
对我来说,它看起来像外部连接(带有检查标志值的条件)。
样本数据:
查询方式:
iszxjhcz2#
你可以这样重写你的查询
| ID|名称|
| --|--|
| 9 |C|
| 1 |一|
fiddle
但是如果表中有很多行,
zlwx9yxi3#
你可以使用
EXISTS
来重写它:或: