Как объединить левое соединение с аналогичным в Sybase SQL? - PullRequest
0 голосов
/ 04 мая 2011

Я застрял, пытаясь объединить like с левым соединением в Sybase.

Например (хотя в моем случае это немного сложнее), я ищутекст, который не содержит ни o, ни i.

Я могу сделать наоборот, то есть текст, содержащий одну из следующих букв:

select numbers.name from 
(
      select 'one'   name union all
      select 'two'   name union all
      select 'three' name union all -- neither %o% nor %i%
      select 'four'  name union all
      select 'five'  name union all
      select 'six'   name union all
      select 'seven' name union all -- neither %o% nor %i%
      select 'eight' name union all
      select 'nine'  name union all
      select 'ten'   name           -- neither %o% nor %i%
) numbers,
(
      select '%o%'  expression union all
      select '%i%'  expression       
) patterns
where
  numbers.name like patterns.expression

выбирает все записи, кроме three, seven и ten, как и ожидалось.

Теперь я ищу способ найти эти три записи.Я думал о левом соединении чисел с шаблонами и последующей фильтрации по выражению null.Примерно так:

numbers.name *like patterns.expression and
patterns.expression is null

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

Для чего стоит эта версия, над которой я работаю:

select @@version
'Adaptive Server Enterprise/15.0.3/EBF 17156 ESD#3/P/Sun_svr4/OS 5.8/ase1503/2726/64-bit/FBO/Fri Feb  5 05:26:23 2010'

1 Ответ

0 голосов
/ 04 мая 2011

Вы должны использовать NOT EXISTS (это так):

select numbers.name from 
(
      select 'one'   name union all
      select 'two'   name union all
      select 'three' name union all -- neither %o% nor %i%
      select 'four'  name union all
      select 'five'  name union all
      select 'six'   name union all
      select 'seven' name union all -- neither %o% nor %i%
      select 'eight' name union all
      select 'nine'  name union all
      select 'ten'   name           -- neither %o% nor %i%
) numbers
where not exists (select null
                    from (
                             select '%o%'  expression union all
                             select '%i%'  expression
                         ) patterns
                   where numbers.name like patterns.expression)
...