【问题标题】:SQL, SQLite Select from 3 tablesSQL, SQLite 从 3 个表中选择
【发布时间】:2011-08-04 09:15:33
【问题描述】:

Table 1 Num1(从0到99的参考表)

表 2 有 Date , Result (有许多由 Date 和 Result 唯一的记录)

表3有Result, Num1, Num2, Num3

我想通过表 3 中的结果加入表 2 并将表 1 Num1 中的每一个与表 3 中的 Num1 或 Num2 或 Num3 之一匹配 日期在哪里

如果找到匹配的 100,如何让它停止一次。它似乎每次都完全扫描表 2。当我接近表格末尾时,选择会更快

【问题讨论】:

  • 标题中引用的第三个表是哪个?表 1 中列的名称是什么?你到底想看什么?优化器如何扫描表主要是优化器的问题。你有合适的索引吗?

标签: sql sqlite


【解决方案1】:

从表面上看,这可能就是你所追求的:

SELECT Num1 AS Num FROM Table2 WHERE Date < '2011-04-12'
UNION
SELECT Num2 AS Num FROM Table2 WHERE Date < '2011-04-12'
UNION
SELECT Num3 AS Num FROM Table2 WHERE Date < '2011-04-12'

这会从 Table2 中的 Num1、Num2 和 Num3 中选择唯一值。

不清楚为什么需要 Table1;但是,可以将此结果与表 1 中的值连接,以确保所选值出现在表 1 中。

不清楚标题中提到的第三个表在哪里,它包含什么,或者如何连接。

如果正如我所料,这没有抓住问题的重点,您需要仔细澄清您希望看到的内容。

【讨论】:

    【解决方案2】:

    要限制 SELECT 查询返回的记录数,您可以使用LIMIT 子句。

    我已尝试提炼出一个符合我对您的查询的理解的查询。但由于你的解释有点神秘,我可能不太明白你想要什么:

      SELECT Table3.Num1
      ,      Table3.Num2
      ,      Table3.Num3
        FROM Table3
             INNER JOIN Table2
                     ON Table3.Result = Table2.Result
             INNER JOIN Table1
                     ON Table1.Num1 IN (Table3.Num1, Table3.Num2, Table3.Num3)
       WHERE Table2.Date < '2011-04-13'
    ORDER BY Table2.Date
       LIMIT 100 -- this will make sure only the first 100 records are returned
      ;
    

    如果这确实做你想要的,那么你可能应该考虑重新设计你的表。必须将 Table1 与 Table3 中的所有三个进行比较。Num1、Num2 和 Num3 看起来很奇怪,更重要的是,对我来说效率很低。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      相关资源
      最近更新 更多