我有一个令人讨厌的表,没有索引,没有键,没有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万行! 请帮助:-(
答案 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。*