#mysql #sql #database #datatables
#mysql #sql #База данных #таблицы данных
Вопрос:
Я пишу sql-запрос, чтобы получить все те записи из таблицы A, которые соответствуют таблице b с определенным условием, и все неучтенные записи из таблицы a, которых нет в таблице b. Ниже приведен код и таблицы
Таблица A
skey OrderName
100 Pen
100 Cutter
101 any
Таблица b
skey OrderName Key
100 Pen True
100 Cutter
select a.skey,a.orderName
from Test_A a
left join Test_B b
on a.skey=b.skey
where b.kit='True' and a.orderName=b.orderName
Результат, который мне нужен, это
skey Ordername
100 Pen (Because this is true in table B)
101 any
Комментарии:
1. Пожалуйста, научитесь правильно помечать свой вопрос. MySQL и Oracle — это два совершенно разных продукта. Что это такое???
Ответ №1:
Вот идея:
select a.skey, a.orderName
from Test_A a left join
Test_B b
on a.skey = b.skey and
a.orderName = b.orderName
where b.kit = 'True' or -- matches and value is true
b.skey is null. -- no match
Комментарии:
1. Спасибо за ответ. Но дело в том, что если таблица b имеет 2 значения, и ни одно из них не имеет значения key как true, тогда мне нужны оба значения в результате. Возможно ли это?
Ответ №2:
Вы можете попробовать следующее —
select a.skey,a.orderName from Test_A a
left join Test_B b
on a.skey=b.skey and a.orderName=b.orderName
where b.kit='True' and b.skey is null
Ответ №3:
Вы можете использовать NOT EXISTS
в WHERE
предложении, подобном этому:
SELECT a.*
FROM Test_A a LEFT JOIN Test_B b
ON b.skey = a.skey AND b.OrderName = a.OrderName
WHERE b.kit = 'True'
OR (b.kit IS NULL AND NOT EXISTS (SELECT 1 FROM Test_B WHERE skey = a.skey AND kit = 'True'))
Или без объединения:
SELECT a.*
FROM Test_A a
WHERE EXISTS (SELECT 1 FROM Test_B b WHERE b.skey = a.skey AND b.OrderName = a.OrderName AND b.kit = 'True')
OR NOT EXISTS (SELECT 1 FROM Test_B b WHERE b.skey = a.skey AND b.kit = 'True')
Смотрите демонстрацию.
Результаты:
> skey | OrderName
> ---: | :--------
> 100 | Pen
> 101 | any