【问题标题】:Trying to pull data from db using sqlite in perl by using multiple tables for filters通过使用多个表进行过滤,尝试在 perl 中使用 sqlite 从数据库中提取数据
【发布时间】:2018-04-07 00:20:33
【问题描述】:

所以我之前在我的 SELECT 语句中使用了一个(我认为很复杂的)IN 语句字符串来做到这一点......但我不小心删除了我的工作文件并丢失了我的最终产品......并且已经忘记了如何去做吧。

我正在寻求重新创建该语句的帮助,或者尝试使用 JOIN.... 我不知道该怎么做。 (我对编程有足够的了解,可以在大约 50% 的时间里四处探索并获得成功。)

我正在使用一个包含三个感兴趣的表的数据库。

表 1 包含: master_id, sub_id1, sub_id2

表 2 包含: sub_id, sub_sub_id1, sub_sub_id2

表 3 包含: sub_sub_id,数据

对于不明确的数据结构,请提前道歉。所以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 以及我需要的相关数据。

我要做的是从表 3 中提取所有 sub_sub_id 和数据,当它们存在于表 1 的树中时。(并非所有 sub_sub_id 都存在于表 3 之外。)

因此,如果在表 2 中找到表 3 中的 sub_sub_id 作为 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 的行。

我希望这有某种意义,并且有足够的信息可以提供帮助!我正在出差旅行,并且远离了上次让我解决这个问题的所有手写便签。 :(

【问题讨论】:

  • 也许:SELECT tbl3.sub_sub_id FROM table3 tbl3 INNER JOIN table2 tbl2 ON tbl3.sub_sub_id = tbl2.sub_sub_id1 INNER JOIN table2 tbl2_1 ON tbl3.sub_sub_id = tbl2.sub_sub_id2 INNER JOIN_table1 tbl1 ON tbl3.sub tbl1.sub_id1 OR tbl3.sub_sub_id = tbl1.sub_id2 WHERE tbl1.sub_id2 不为空;
  • “table3 tbl3”冗余是否是 FROM 或 JOIN 语句的一部分?还是只在它们之间插入一次?
  • 或者是合并表的占位符之一?
  • 目前没有任何运气,但不应该:INNER JOIN table1 tbl1 ON tbl3.sub_sub_id = tbl1.sub_id1 OR tbl3.sub_sub_id = tbl1.sub_id2" be: "INNER JOIN table1 tbl1 ON tbl2. sub_id = tbl1.sub_id1 OR tbl2_1.sub_id = tbl1.sub_id2 WHERE tbl1.sub_id2"

标签: mysql sqlite perl


【解决方案1】:

我认为这行得通。我在 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
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2019-06-26
    相关资源
    最近更新 更多