我已经得到以下声明,它给了我想要的确切结果。问题是,执行大约需要20分钟:
select fallid, schreibdatum, fachloe, autor, titel from tbltext
where schreibdatum >= '01.01.2015'
and stornierer is null
and texttyp like 'Entl%'
and (titel like '%vorl.%' or titel like '%Vorl.%' or titel like '%vorläu%' or titel like '%Vorläu%')
and concat(fallid, fachloe) not in
(
select concat(fallid, fachloe) from tbltext
where schreibdatum >= '01.01.2015'
and stornierer is null
and texttyp like 'Entl%'
and (titel not like '%vorl.%' and titel not like '%Vorl.%' and titel not like '%vorläu%' and titel not like '%Vorläu%')
and (titel like '%Entlas%' or titel like '%entlas%')
);
我知道有几个部分可以减慢速度。我知道许多喜欢都很糟糕,但我不知道如何避免这种情况。除此之外,我还搜索了其他问题,因为这些问题很慢,并且#34; not-in-clauses"但我不知道如何获得我的" concat-key"在同一个表中成为join或exists not clause。
非常感谢任何帮助。
答案 0 :(得分:1)
可以有几种方法来加快此查询
并跳过where子句
中的连接操作你可以尝试自我加入,而不是使用not in clause..like follow (查询可能不会给出预期的结果)
select tab1.fallid, tab1.schreibdatum, tab1.fachloe, tab1.autor, tab1.titel from
(
select concat(fallid, fachloe) concatedTxt1, fallid, schreibdatum, fachloe, autor, titel from tbltext
where schreibdatum >= '01.01.2015'
and stornierer is null
and texttyp like 'Entl%'
and (titel not like '%vorl.%' and titel not like '%Vorl.%' and titel not like '%vorläu%' and titel not like '%Vorläu%')
and (titel like '%Entlas%' or titel like '%entlas%')
) tab1,
(
select concat(fallid, fachloe) concatedTxt2, fallid, schreibdatum, fachloe, autor, titel from tbltext
where schreibdatum >= '01.01.2015'
and stornierer is null
and texttyp like 'Entl%'
and (titel like '%vorl.%' or titel like '%Vorl.%' or titel like '%vorläu%' or titel like '%Vorläu%')
) tab2
where tab1.fallid =tab2.fallid and concatedTxt1 != concatedTxt2
答案 1 :(得分:0)
WITH temp AS
(SELECT allid, schreibdatum, fachloe, autor, titel, concat(fallid, fachloe) keyText,
CASE
WHEN titel LIKE '%vorl.%' OR titel LIKE '%Vorl.%' OR titel LIKE '%vorläu%' OR titel LIKE '%Vorläu%'
THEN 'Y' ELSE 'N'
END "HAS_VALUE_VORL",
CASE
WHEN lower(titel) LIKE '%entlas%' THEN 'Y' ELSE 'N'
END "HAS_VALUE_ENTLAS"
FROM tbltext
WHERE schreibdatum >= '01.01.2015'
AND stornierer IS NULL
AND texttyp LIKE 'Entl%'
)
SELECT *
FROM temp t1
WHERE HAS_VALUE_VORL='Y'
AND NOT EXISTS
( SELECT 'X' FROM temp t2 WHERE HAS_VALUE_ENTLAS='Y' AND t1.keyText=t2.keyText
);