【问题标题】:how to reuse result from sub query in sqlite如何在sqlite中重用子查询的结果
【发布时间】:2013-11-01 12:00:13
【问题描述】:

在使用 SQLite 处理移动项目时,我遇到了类似于以下代码的查询:

SELECT col_aa, col_ab FROM tbl_a
WHERE col_ac IN (SELECT col_ba FROM tbl_b WHERE col_bb IN (SELECT col_ca FROM tbl_c WHERE col_cb = 1))
AND col_ad IN (SELECT col_ba FROM tbl_b WHERE col_bb IN (SELECT col_ca FROM tbl_c WHERE col_cb = 1))

很明显,这些子查询是多余和浪费的。

经过一些研究,似乎 CTE(公共表表达式)可能是一种解决方案,但该功能在 SQLite 上不可用。 (因此,我不确定 WITH temp AS 语句是否有效)

有没有更好的方法来重组查询以重用子查询的结果?

【问题讨论】:

  • 在 SQLite 中,我通常将子查询数据插入到临时表中。但除非您的查询真的非常昂贵,否则不值得努力。如果只需要一行,可以使用 fake JOINs 将数据保留在当前数据集中。

标签: sql sqlite subquery


【解决方案1】:

假设tbl_b.col_ba 是一个主键(或只是唯一字段)简单的JOIN 应该会有所帮助。试试这个 SQL:

SELECT 
  col_aa, 
  col_ab 
FROM 
  tbl_a JOIN
    (
      SELECT col_ba 
      FROM tbl_b 
      WHERE col_bb IN 
       (
         SELECT col_ca 
         FROM tbl_c 
         WHERE col_cb = 1
       )
    ) T2 ON (col_ac = T2.col_ba AND col_ad = T2.col_ba) 

希望对你有帮助

【讨论】:

  • 以这种方式连接表时,只返回 col_ac = col_ad 的行。
【解决方案2】:

您可以创建一个视图,如下所示....(抱歉,代码未经测试)

CREATE VIEW my_view AS 
SELECT col_ba FROM tbl_b WHERE col_bb IN (SELECT col_ca FROM tbl_c WHERE col_cb = 1)

SELECT col_aa, col_ab FROM tbl_a
WHERE col_ac IN (SELECT col_ba FROM my_view)
AND col_ad IN (SELECT col_ba FROM my_view)

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2021-12-05
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多