加快sql,加入两列

Posted

技术标签:

【中文标题】加快sql,加入两列【英文标题】:speed up sql, join onto two columns 【发布时间】:2021-11-21 21:13:39 【问题描述】:

美好的一天。 我正在根据特定日期、商店和文章加入手头上的库存。 似乎加入时间太长了。

只有一些商店会有一些文章。第1条只在A店有售,B店没有。

我提前知道我查询的是A店的第1条,B店的第2条,因为那是卖的。

与其查询每个商店的两篇文章的库存,如何加快查询速度,我可以只加入特定的组合 A1、B2,是否可以组合 FROM 表中的两列? 谢谢

Q3_SOH AS (
  SELECT
    CONCAT(Article,"|",Site,"|",Calendar_Day) AS ID, 
    Site, 
    Article, 
    SOH_Cost, 
    SOH_Qty_EA, 
    Calendar_Day,   
     
  FROM
    `gcp-table`
  WHERE
    Calendar_Day BETWEEN DATE_ADD(startDate, INTERVAL -1 day) AND endDate
    AND Site IN (
        SELECT DISTINCT Site
        FROM  Q1)
    AND Article IN (
        SELECT DISTINCT Article
        FROM Q1))

你好,谢谢你的帮助,非常聪明。 我正在使用 GCP bigquery,这些部分是 WITH 的一部分,Q1 获得销售额,Q3 用于库存。 然后加入和编写计算字段相对容易。这个 SOH 表是一个海量数据库。 以这种方式加入似乎并不是一种改进,因为我仍在将所有文章加入所有商店。 我相信所有商店都有文章,但大多数商店的数量为零。 我们可以多次阅读同一篇文章。 我可以写类似的东西

in Q1 CONCAT(Site, Article) as ID



SELECT 
 site, article, soh_cost, soh_qty, date, 
 concat(site, article) AS ID
FROM 'gcp-b'
WHERE
concat(site, article) in DISTINCT(Q1.ID)

原来的似乎最快。 花费的时间最少。

【问题讨论】:

我为 mysql 添加了一个标签 - 我假设这是您使用的平台? 您尚未发布完整的查询。请发布完整的查询,指明表大小和索引,最好包括查询计划。 IN (SELECT DISTINCT...) 有时可以重写为 WHERE EXISTS 以提高性能,但这取决于您当前的查询计划和索引 缺少什么吗?我不认识这种语法:Q3_SOH AS (. 网站和文章都来自第一季度?然而你不知道他们配对吗? 【参考方案1】:

你可以使用连接来达到同样的效果

  SELECT
    CONCAT(Article,"|",Site,"|",B.Calendar_Day) AS ID, 
    B.Site, 
    B.Article, 
    B.SOH_Cost, 
    B.SOH_Qty_EA, 
    B.Calendar_Day
  FROM `gcp-table` as B
  JOIN Q1 as QS ON B.Site = QS.Site
  JOIN Q1 as QA ON B.Article = QA.Article
  WHERE  Calendar_Day BETWEEN DATE_ADD(startDate, INTERVAL -1 day) AND endDate

请注意,如果网站或文章在第一季度出现多次,请按以下方式进行:

  SELECT
    CONCAT(Article,"|",Site,"|",B.Calendar_Day) AS ID, 
    B.Site, 
    B.Article, 
    B.SOH_Cost, 
    B.SOH_Qty_EA, 
    B.Calendar_Day
  FROM `gcp-table` as B
  JOIN (SELECT DISTINCT SITE FROM Q1) as QS ON B.Site = QS.Site
  JOIN (SELECT DISTINCT ARTICLE FROM Q1) as QA ON B.Article = QA.Article
  WHERE  Calendar_Day BETWEEN DATE_ADD(startDate, INTERVAL -1 day) AND endDate

【讨论】:

以上是关于加快sql,加入两列的主要内容,如果未能解决你的问题,请参考以下文章

ACCESS有一个表,我想根据A列或是C列两列数据中的任意数据进行查询,怎么创建查询? 哪位高人可以指点下

Mysql:创建触发器添加两列值

Laravel - 加入然后别名两列

如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来

sql查询中,如何将某列 分成 两列。

MySQL计算两列上的唯一值并为每列加入这些计数