通过删除“行”选择TaQL

时间:2019-02-06 10:18:53

标签: taql

我有一个令人讨厌的表,没有索引,没有键,没有ID,没有顺序,有25列,1900万行。

我需要选择不满足3组条件的所有行:

19<columnT<27 && columnD==14
31<columnT<43 && columnD==17
57<columnT<71 && columnD==62

(实际上有数百种条件)。它不是一种严格的SQL语言,而是一种类似于SQL的语言,称为TaQL(“表查询语言”)。 我尝试过的:

select * 
from hugetable 
where not exists( 
    select * 
    from hugetable TT 
   where ((TT.columnT>19 && TT.columnT<27 && TT.columnD==14) ||
         (TT.columnT>31 && TT.columnT<43 && TT.columnD==17) ||
         (TT.columnT>57 && TT.columnT<71 && TT.columnD==62) ))

所选行为0,但我知道应该超过1200万行! 请帮助:-(

4 个答案:

答案 0 :(得分:1)

以上答案在语法上是可以的,但我认为问题出在排除列表中。...

将排除项与用于比较的列配合使用

 select * 
    from hugetable 
    where columnT NOT IN
    (     select columnT
        from hugetable TT 
       where ((TT.columnT>19 && TT.columnT<27 && TT.columnD==14) ||
             (TT.columnT>31 && TT.columnT<43 && TT.columnD==17) ||
             (TT.columnT>57 && TT.columnT<71 && TT.columnD==62) ))

答案 1 :(得分:0)

如果TaQL支持,则可以使用EXCEPT做到这一点:-

select TT.* 
from hugetable TT

Except

Select TT.*
from hugetable TT
 where  (    (TT.columnT > 19 AND TT.columnT < 27 AND TT.columnD = 14)
          OR (TT.columnT > 31 AND TT.columnT < 43 AND TT.columnD = 17)
          OR (TT.columnT > 57 AND TT.columnT < 71 AND TT.columnD = 62));

如果不可能,是否可以添加一个附加的标志列,然后根据您的条件对其进行更新(例如,将其默认设置为1,然后根据where子句更新为0)?

答案 2 :(得分:0)

正如HoneyBadger提到的那样,该查询无法正常工作,因为该子查询与外部查询没有关联。

您也可以使用此

select *
from hugetable
where
    (columnD == 14 && ( columnT <= 19 || columnT >= 27)) ||
    (columnD == 17 && ( columnT <= 31 || columnT >= 43)) ||
    (columnD == 62 && ( columnT <= 57 || columnT >= 71)) ||
    columnD not in (14, 17, 52)

请注意,结尾处的not很重要,因此您可以考虑columnD = 5的记录。 我使用了与您相同的语法,但也许您的sql-ish语言具有NOT BETWEEN可用。

答案 3 :(得分:0)

我测试了大多数提供和删除的答案,并且能够实现我想要的。 选择中的点在TaQL中不起作用,它表示存在以下错误:     选择TT。*