Выбор TaQL путем удаления «строк» - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть одна таблица abhorrend, без индекса, без ключей, без идентификаторов, без порядка, 25 столбцов, 19 миллионов строк.

Мне нужно выбрать все строки, которые не удовлетворяют 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, но я знаю, что их должно быть больше 12 миллионов!Пожалуйста, помогите: - (

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

Я проверил большинство предоставленных и удаленных ответов, и я смог добиться того, чего хотел.Точка в выделении не работает в TaQL, она говорит об ошибке в: выберите TT. *

0 голосов
/ 06 февраля 2019

приведенный выше ответ в порядке с синтаксисом, но я предполагаю, что проблема связана со списком исключений ...

исключение будет работать нормально с колонкой, используемой для сравнения

 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) ))
0 голосов
/ 06 февраля 2019

Как упоминалось 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 in в конце важно, поэтому вы должны рассмотреть записи, где columnD = 5, например.Я использовал тот же синтаксис, что и вы, но, возможно, на вашем языке sql-ish доступно NOT BETWEEN.

0 голосов
/ 06 февраля 2019

Вы можете сделать это с ИСКЛЮЧЕНИЕМ, если TaQL поддерживает это: -

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, а затем обновить до 0 в зависимости от вашего предложения where)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...