所以我之前通过在我的SELECT语句中使用(我认为复杂的)IN语句字符串来完成此操作...但我不小心删除了我的工作文件并丢失了我的最终产品...并且忘记了如何做到这一点。
我正在寻找帮助来重新创建该声明,或者尝试使用JOIN ....我不知道该怎么做。 (我对编程有足够的了解,可以在50%的时间内获得成功。)
我正在使用一个有三个感兴趣的表的数据库。
表1包含: master_id,sub_id1,sub_id2
表2包含: sub_id,sub_sub_id1,sub_sub_id2
表3包含: sub_sub_id,data
提前抱歉模糊的数据结构。所以master_id由sub_id1和sub_id2组成。 sub_id1和sub_id2被标识为表2中的普通sub_id,包括sub_sub_id1和sub_sub_id2。 Sub_sub_id1和2被标识为表3中的sub_sub_id以及我需要的相关数据。
我想要做的是在表1的树中存在表3中的所有sub_sub_ids和数据。(并非所有sub_sub_id都存在于表3之外。)
因此,如果表3中的sub_sub_id被发现为表2中的sub_sub_id1或sub_sub_id2,并且如果在表1中找到表2中的对应sub_id为sub_id1或sub_id2,则从表3中获取sub_sub_id和数据。
为了使事情变得更复杂,并非每个master_id都有一个sub_id2。我只想查看同时包含sub_id1和sub_id2的行。
我希望这有一定道理,并且有足够的信息可以提供帮助!我上班的时候远离了上次让我解决这个问题的手写划痕笔记。 :(
答案 0 :(得分:0)
我认为这很有效。我在sqlite 3.11.0版中测试了它。如果您使用早于3.8.3的sqlite(不理解WITH
子句),请将t1_can_be_used
和t1_can_be_used
更改为真实的表或视图。
create table t1 as
select 1 master_id, 10 sub_id1, 20 sub_id2 union
select 2 master_id, 40 sub_id1, 50 sub_id2 union
select 3 master_id, 30 sub_id1, null sub_id2 union
select 4 master_id, 60 sub_id1, 70 sub_id2 union
select 5 master_id, 80 sub_id1, 90 sub_id2;
create table t2 as
select 10 sub_id, 100 sub_sub_id1, 200 sub_sub_id2 union
select 20 sub_id, 300 sub_sub_id1, 400 sub_sub_id2 union
select 30 sub_id, 500 sub_sub_id1, 600 sub_sub_id2 union
select 35 sub_id, 700 sub_sub_id1, 300 sub_sub_id2;
create table t3 as
select 100 sub_sub_id, 'ABC' data union
select 200 sub_sub_id, 'QED' data union
select 300 sub_sub_id, 'XYZ' data union
select 400 sub_sub_id, 'WWW' data union
select 500 sub_sub_id, 'CIA' data union
select 600 sub_sub_id, 'KGB' data union
select 700 sub_sub_id, 'FDR' data union
select 800 sub_sub_id, 'JFK' data;
with
t1_can_be_used as (
select * from t1
where sub_id1 is not null
and sub_id2 is not null
),
t2_can_be_used as (
select * from t2
where sub_id in (
select sub_id1 from t1_can_be_used union
select sub_id2 from t1_can_be_used
)
)
select * from t3
where sub_sub_id in (
select sub_sub_id1 from t2_can_be_used union
select sub_sub_id2 from t2_can_be_used
);