【问题标题】:Best way to count a filtered table计算过滤表的最佳方法
【发布时间】:2021-02-05 08:05:26
【问题描述】:

我有一张这样结构的大桌子:

myTable:                       otherTable:
+----------+------+-------+    +-----+-------+-----+
|   Date   | Type | Ref   |    | ID  | Field | Ref |
+----------+------+-------+    +-----+-------+-----+
| 1/1/2020 |    1 | XXX   |    |  1  | Val1  | XXX |
| 1/1/2020 |    2 | XXX   |    |  2  | Val2  | YYY |
| 1/2/2020 |    1 | YYY   |    |  3  | Val3  | AAA |
| ...      |  ... | ...   |    | ... | val4  | BBB |
+----------+------+-------+    +-----+-------+-----+

我想用单个 Ref 值计算特定日期间隔内具有特定类型的所有行。

Result:
+-----+-------+-----+-------+
| ID  | Field | Ref | Count |
+-----+-------+-----+-------+
|  1  | Val1  | XXX |     3 |
|  2  | Val2  | YYY |     1 |
|  3  | Val3  | AAA |     0 |
| ... | val4  | BBB |     2 |
+-----+-------+-----+-------+

这是在日期过滤器之后计算值的最佳方法吗?

SELECT otherTable.* ,
   ( SELECT Count(*) 
      FROM  myTable
      WHERE  myTable.Type IN ( 2, 12 ) 
        AND myTable.Ref = otherTable.Ref 
        AND Date BETWEEN Dateadd('d', now(), -7) AND Dateadd('d', now(), +7)
    ) as myCount
FROM otherTable

或者这个?

SELECT otherTable.* ,
   ( SELECT Count(*) 
      FROM  ( SELECT * FROM myTable
        WHERE  myTable.Type IN ( 2, 12 ) 
          AND myTable.Ref = otherTable.Ref 
          AND Date BETWEEN Dateadd('d', now(), -7) AND Dateadd('d', now(), +7)
      )
    ) as myCount
FROM otherTable

我正在学习 SQL 并寻找保存性能的方法。 提前谢谢!

【问题讨论】:

  • 额外的子查询通常不会提高性能。在许多情况下,这没有什么区别。

标签: sql ms-access


【解决方案1】:

在 Ref 字段上的 JOIN 可能比在 WHERE 子句中匹配更有效。也许应该对 myTable 的计数进行 GROUP BY 查询,然后将该查询加入 otherTable:

SELECT otherTable.*, Cnt 
FROM otherTable 
INNER JOIN
   (SELECT Ref, Count(*) AS Cnt 
    FROM myTable
    WHERE [Type] IN (2, 12) 
    AND [Date] BETWEEN Dateadd('d', Date(), -7) AND Dateadd('d', Date(), +7)
    GROUP BY Ref) AS myCount
ON otherTable.Ref = myCount.Ref;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多