Преобразование сложного требования в запрос SQL

У меня проблемы с реляционной алгеброй и преобразованием в SQL этого довольно сложного запроса:

Мне нужно выбрать все значения из таблицы A, присоединенной к таблице B, где в таблице B нет совпадающих записей или есть совпадающие записи, но в наборе совпадающих записей нет поля, содержащего одно из 4 из 8 возможных значений.,

База данных - MySQL 5.0... с использованием механизма InnoDB для таблиц.

3 ответа

Решение

Я не уверен, есть ли реальное улучшение производительности, но есть еще один способ:

SELECT 
    *
FROM
    tableA
WHERE
    id NOT IN ( SELECT id FROM tableB WHERE field1 NOT IN ("value1", "value2"));
Select 
  a.* 
from 
  a 
left join 
  b 
on 
  a.id=b.id 
where 
  b.id is null 
or 
  b.field1 not in ("value1","value2","value3","value4");

Ваши требования немного неясны. Моя первая интерпретация заключается в том, что вам нужны только столбцы A, а не более одного экземпляра данной строки A.

select * from A where not exists (
  select B.id 
    from B 
   where B.id=A.id 
     and B.field in ('badVal1','badVal2','badVal3','badVal4')
)

Моя вторая интерпретация заключается в том, что вы хотите, чтобы все столбцы (внешний соединенный с B) имели, возможно, более одного экземпляра строки A, если имеется несколько строк B, если не существует строки B с запрещенным значением.

select * from A
  left outer join B on A.id=B.id
 where not exists (
               select C.id
                 from B as C
                where A.id=C.id
                  and C.field in ('badVal1','badVal2','badVal3','badVal4')
           )

Оба запроса могут быть выражены с использованием NOT IN вместо коррелированных NOT EXISTS. Трудно понять, что будет быстрее, не зная данных.

Другие вопросы по тегам