尝试使用perl中的sqlite通过使用多个表来过滤来从db中提取数据

时间:2017-10-25 19:14:24

标签: mysql sqlite perl

所以我之前通过在我的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的行。

我希望这有一定道理,并且有足够的信息可以提供帮助!我上班的时候远离了上次让我解决这个问题的手写划痕笔记。 :(

1 个答案:

答案 0 :(得分:0)

我认为这很有效。我在sqlite 3.11.0版中测试了它。如果您使用早于3.8.3的sqlite(不理解WITH子句),请将t1_can_be_usedt1_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
);