SQL"不在"与concat键在同一个表上的子句

时间:2016-07-19 07:22:41

标签: sql oracle

我已经得到以下声明,它给了我想要的确切结果。问题是,执行大约需要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。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

可以有几种方法来加快此查询

  1. 每隔一小段时间查询一次,具体取决于数据如何分散并获取结果,而只是在一个查询中执行此操作
  2. 检查您在where子句
  3. 中使用的列的索引
  4. 您可以选择自我加入而不是使用NOT IN子句
  5. 并跳过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
  );