【问题标题】:SQLITE: select in query, subquery data with WHERE INSQLITE:在查询中选择,使用 WHERE IN 子查询数据
【发布时间】:2019-08-22 07:10:13
【问题描述】:

我有以下疑问:

SELECT en_lect, en_main, en_opref, en_id, en_meros, en_family, en_header 
FROM entries 
WHERE en_id IN ( 
      SELECT en_family 
      FROM entriesSmallSplit 
      WHERE (en_tonismenosplit = ?) AND (en_ref = 0) AND (en_se = 0) 
) 
ORDER BY en_meros DESC, en_id DESC;

子查询中的entriesSmallSplit 表有一个名为FirstLetter 的列。我希望能够返回FirstLetter 在第一个查询SELECT en_lect, en_main, en_opref, en_id, en_meros, en_family, en_header 的结果中包含的数据。 entriesSmallSplit 表结构:

en_tonismenosplit, en_family, FirstLetter, en_ref, en_se
---------------------------------------
aaa, 123, g, 0, 0
bbb, 123, f, 0, 0
ccc, 321, f, 0, 0

entries表结构

en_id, en_lect, en_main, en_opref, en_meros, en_family, en_header
---------------------------------------
123, ddd, 1, 0, 5, 123, 44
473, eee, 2, 0, 6, 473, 55

如果用户查询aaa 我希望结果是:

ddd, 1, 0, 123, 5, 123, 44, g(其中 gentriesSmallSplit 表中)

这可能吗,我怎样才能有效地做到这一点?

提前谢谢你。

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    类似:

    SELECT en_lect, en_main, en_opref, en_id, en_meros, e.en_family, en_header, FirstLetter 
    FROM entries AS e
    JOIN entriesSmallSplit AS ess ON en_id = ess.en_family
    WHERE en_tonismenosplit = ? AND en_ref = 0 AND en_se = 0 
    ORDER BY en_meros DESC, en_id DESC;
    

    为了提高效率,您需要在entries(en_id)entriesSmallSplit(en_tonimenosplit, en_ref, en_se, en_family) 上建立索引。这些将消除对全表扫描的需要;只会查看两个表的相关行,而那些不可能返回的行将被完全跳过。

    【讨论】:

    • 谢谢,你和 scaisEdge 的答案都是一样的,我只点击他作为接受,因为它更快(在我的电脑上是 85 毫秒而不是 120 毫秒),因为内部子句而不是简单的 JOIN .
    • @MirrorMirror 一旦你修复另一个包含你想要的FirstLetter 列,它们实际上编译成完全相同的字节码。 (INNER JOINJOIN 是一回事)。如果您将过滤器放在WHEREON 中,这主要是风格和个人喜好的问题;对于没有明确链接两个表中的行的事情,我更喜欢前者。
    • 是的,我已经修好了。由于某些原因,在 sqlite 专家个人中它更快,我不知道为什么。我可能必须查看架构才能了解原因。你的实际上更具可读性,因为它有 WHERE
    【解决方案2】:

    你可以使用内连接来代替 IN 子句

    SELECT e.en_lect, e.en_main, e.en_opref, e.en_id, e.en_meros, e.en_family, e.en_header 
    FROM entries e
    INNER JOIN entriesSmallSplit  s ON s.en_family = e.en_id 
      AND s.en_tonismenosplit = ?
        AND s.en_ref = 0
          AND s.en_se = 0
    

    和 INNER JOIN 通常比 IN 子句更有效.. 因为一个 IN 子句相当于几个 .. INNER JOIN 只是一个查询

    【讨论】:

      【解决方案3】:

      你可以使用JOIN来实现这个。

      SELECT e.en_lect, e.en_main, e.en_opref, e.en_id, e.en_meros, e.en_family, e.en_header, ess.FirstLetter
      FROM entries AS e
      INNER JOIN entriesSmallSplit AS ess
      ON e.en_family=ess.en_family
      WHERE ess.en_tonismenosplit="aaa"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多