替代 WHERE 子句中的多个连接?
Alternative to multiple concats in WHERE clause?
我有一个像这样的大查询:
SELECT 'Tipification', COUNT(*) TOTAL, to_char(INITDATE,'YYYY-MM-DD')
FROM (
SELECT (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM ) Triplet, INITDATE
FROM TABLE
WHERE USER IS NOT null
AND (INITDATE >= TO_DATE('2016-12-01 00:00', 'YYYY-MM-DD HH24:MI:SS'))
AND (INITDATE <= TO_DATE('2016-12-31 23:59', 'YYYY-MM-DD HH24:MI:SS'))
AND ( (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'aaa \ bbb \ ccc'
OR (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'aaa \ bbb \ ddd'
OR (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'xxx \ yyy \ zzz'
OR (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'qqq \ www \ eee'
... etc ...
)
GROUP BY to_char(INITDATE,'YYYY-MM-DD')
它去哪里进行了 300 多个字符串连接:(TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = '... \ ... \ ...'
。
执行此查询时,我得到了一些核心转储,因为它对 DB 来说执行起来太昂贵了。
有没有其他方法可以在数据库 运行 内存不足的情况下执行这样的查询?
Oracle 有一个很好的 in
函数,允许您放入多个列组合。
select to_char(INITDATE,'YYYY-MM-DD'), count(*)
from table
where user is not null
AND (INITDATE >= TO_DATE('2016-12-01 00:00', 'YYYY-MM-DD HH24:MI:SS'))
AND (INITDATE <= TO_DATE('2016-12-31 23:59', 'YYYY-MM-DD HH24:MI:SS'))
and (type, subtype, problem) in (
('aaa','bbb','ccc'),
('aaa','bbb','ddd')) -- ... etc
group by to_char(INITDATE,'YYYY-MM-DD')
SAP HANA DB
连接查询的替代方法:
select * from table_name
WHERE (col_name1,col_name2,col_name3)
IN (('value1','value2','value3'),.....);
同样,也可以在更新和删除查询中使用它。
我有一个像这样的大查询:
SELECT 'Tipification', COUNT(*) TOTAL, to_char(INITDATE,'YYYY-MM-DD')
FROM (
SELECT (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM ) Triplet, INITDATE
FROM TABLE
WHERE USER IS NOT null
AND (INITDATE >= TO_DATE('2016-12-01 00:00', 'YYYY-MM-DD HH24:MI:SS'))
AND (INITDATE <= TO_DATE('2016-12-31 23:59', 'YYYY-MM-DD HH24:MI:SS'))
AND ( (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'aaa \ bbb \ ccc'
OR (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'aaa \ bbb \ ddd'
OR (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'xxx \ yyy \ zzz'
OR (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'qqq \ www \ eee'
... etc ...
)
GROUP BY to_char(INITDATE,'YYYY-MM-DD')
它去哪里进行了 300 多个字符串连接:(TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = '... \ ... \ ...'
。
执行此查询时,我得到了一些核心转储,因为它对 DB 来说执行起来太昂贵了。
有没有其他方法可以在数据库 运行 内存不足的情况下执行这样的查询?
Oracle 有一个很好的 in
函数,允许您放入多个列组合。
select to_char(INITDATE,'YYYY-MM-DD'), count(*)
from table
where user is not null
AND (INITDATE >= TO_DATE('2016-12-01 00:00', 'YYYY-MM-DD HH24:MI:SS'))
AND (INITDATE <= TO_DATE('2016-12-31 23:59', 'YYYY-MM-DD HH24:MI:SS'))
and (type, subtype, problem) in (
('aaa','bbb','ccc'),
('aaa','bbb','ddd')) -- ... etc
group by to_char(INITDATE,'YYYY-MM-DD')
SAP HANA DB
连接查询的替代方法:
select * from table_name
WHERE (col_name1,col_name2,col_name3)
IN (('value1','value2','value3'),.....);
同样,也可以在更新和删除查询中使用它。