2015-02-24 6 views
0

Я пытаюсь найти все значения в таблице моих хостов, которые не содержат частичного соответствия значениям в моей таблице maildomains.Язык запроса на улов возвращает только значения, где NOT LIKE значение в другой таблице

hosts 
+-------------------+-------+ 
|  host  | score | 
+-------------------+-------+ 
| www.gmail.com  | 489 | 
| www.hotmail.com | 653 | 
| www.google.com | 411 | 
| w3.hotmail.ca  | 223 | 
| stackexchange.com | 950 | 
+-------------------+-------+ 
maildomains 
+---------------+ 
| email   | 
+---------------+ 
| gmail   | 
| hotmail  | 
| outlook  | 
| mail   | 
+---------------+ 

В частности, я ищу, чтобы сделать SELECT * хостов, где hosts.host НЕ НРАВИТСЯ любое значение «% .maildomains.email%»

Desired output: 
+-------------------+-------+ 
|  host  | score | 
+-------------------+-------+ 
| www.google.com | 411 | 
| stackexchange.com | 950 | 
+-------------------+-------+ 

Вот как я думаю, что он должен работать логически:

SELECT h.*, m.email FROM (SELECT h.* FROM hosts WHERE score > 100 as h) 
h LEFT OUTER JOIN maildomains m ON (h.host LIKE CONCAT('%.',m.email,'%')) 
WHERE m.email IS NULL 

Это приводит к 10017 ошибки: обе левые и правые псевдонимами встреченных в присоединиться к '' % ''

Мне также удалось получить аналогичный запрос для запуска без ошибок, как JOIN CROSS, но он дает плохие результаты:

SELECT h.*, m.email FROM (SELECT h.* FROM hosts WHERE score > 100 as h) 
h CROSS JOIN maildomains m 
WHERE h.host NOT LIKE CONCAT('%.',m.email,'%') 

+-------------------+---------+---------+ 
|  p.host  | p.score | m.email | 
+-------------------+---------+---------+ 
| www.gmail.com  |  489 | hotmail | 
| www.gmail.com  |  489 | outlook | 
| www.gmail.com  |  489 | mail | 
| www.hotmail.com |  653 | gmail | 
| www.hotmail.com |  653 | outlook | 
| www.hotmail.com |  653 | mail | 
| www.google.com |  411 | gmail | 
| www.google.com |  411 | hotmail | 
| www.google.com |  411 | outlook | 
| www.google.com |  411 | mail | 
| w3.hotmail.ca  |  223 | gmail | 
| w3.hotmail.ca  |  223 | outlook | 
| w3.hotmail.ca  |  223 | mail | 
| stackexchange.com |  950 | gmail | 
| stackexchange.com |  950 | hotmail | 
| stackexchange.com |  950 | outlook | 
| stackexchange.com |  950 | mail | 
+-------------------+---------+---------+ 

Я ценю любые и все указания.

ответ

0

Если ваша версия улей 0,13 или более поздней версии, чем вы могли бы использовать subquery в предложении WHERE для фильтрации строк из hosts таблицы. Ниже приводится более обобщенный подход, который не требует от вас, чтобы перечислить все домены верхнего уровня можно найти в ваших данных:

SELECT host, score 
FROM hosts 
WHERE 
    regexp_extract(hosts.host, "(?:.*?\\.)?([^.]+)\\.[^.]+", 1) NOT IN 
    (SELECT email FROM maildomains); 

Этот подход изолирует часть домена узла непосредственно перед ДВУ с regexp_extract, а затем проверяет, существует ли это доменное имя в подзапросе в таблице maildomains.

1

Вы могли бы сделать что-то вроде этого:

select host from hosts h left outer join maildomains m on (regexp_replace(regexp_replace(regexp_replace(regexp_replace(h.host,'www.',''),'.com',''),'.ca',''),'w3.','') = m.email) where email is NULL;