Преобразование сложного требования в запрос 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. Трудно понять, что будет быстрее, не зная данных.