【问题标题】:UNION ALL for several subqueries takes a long time几个子查询的 UNION ALL 需要很长时间
【发布时间】:2022-01-25 16:14:58
【问题描述】:

我正在尝试计算下表中的几个项目:

food
apple cider
cake manzana (manzana in spanish == apple)
carrot cake
banana pudding

我希望得到下表:

food count
apple 2
carrot 1
banana 1

我尝试了以下查询apples

SELECT 'apple' as placeholder, COUNT(*)
FROM table WHERE (food LIKE '%apple%' OR food LIKE '%manzana%') and date > '10/10/2021'

问题是当我尝试扩展它以将所有食物放在一起时,需要很长时间:

SELECT 'apple' as placeholder, COUNT(*) FROM table WHERE (food LIKE '%apple%' OR food LIKE '%manzana%') and date > '10/10/2021' and ...
UNION ALL
SELECT 'carrot' as placeholder, COUNT(*) FROM table WHERE food LIKE '%carrot%'  and date > '10/10/2021' and ...
UNION ALL
SELECT 'banana' as placeholder, COUNT(*) FROM table WHERE food LIKE '%banana%' and date > '10/10/2021' and ...

还有其他方式来构造这个查询吗?

【问题讨论】:

  • 我会责怪 LIKE 而不是 UNION ALL。
  • 是的,需要时间,因为Like操作和表中的记录数。尝试将每个结果存储到 Temp 表中,然后合并 # 个表。
  • 每个查询本身需要大约 9 秒,但是当我将它们与 UNION ALL 一起添加时,它们需要更长的时间(已经过了几分钟,但还没有完成)@jarlh
  • 日期索引可能会有很大帮助。

标签: sql sql-server subquery


【解决方案1】:

将您要查找的食物加载到临时表中,然后加入 LIKE

CREATE TABLE #findfood (food_to_find nvarchar(50));

INSERT INTO #findfood (food_to_find)
VALUES ('apple'),('carrot'),('banana');

CREATE TABLE #food (food_name nvarchar(100));

INSERT INTO #food (food_name)
VALUES ('apple cider'),('cake apple'),('carrot cake'),('banana pudding');

SELECT food_to_find, COUNT(*) AS count_food_name
FROM #findfood
    INNER JOIN #food ON #food.food_name LIKE '%' + #findfood.food_to_find + '%'
GROUP BY food_to_find;

【讨论】:

【解决方案2】:

你为什么不这样做:

SELECT CASE WHEN food LIKE '%apple%' THEN 'apple'
            WHEN food LIKE '%carrot%' THEN 'carrot'
            WHEN food LIKE '%banana%' THEN 'banana' END AS placeholder, COUNT(*) 
FROM   Atable 
WHERE  dates > '2021-01-01' ---
GROUP  BY CASE WHEN food LIKE '%apple%' THEN 'apple'
            WHEN food LIKE '%carrot%' THEN 'carrot'
            WHEN food LIKE '%banana%' THEN 'banana' END 

--> 例子:

CREATE TABLE Atable (food VARCHAR(32), dates date);

INSERT INTO Atable VALUES
('qsqszcbananasqwdcqdesc', '2022-01-01'), 
('qsdvdszcbananasqwdcqdeqfeqsdc', '2022-01-01'), 
('qsqszccarrotsqwdcqdesc', '2022-01-01');

--> 结果:

placeholder (Aucun nom de colonne)
banana      2
carrot      1

【讨论】:

  • 是的,但是只有 3 个元素我不会创建这样的对象来这样做......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2018-01-09
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多