проблема с соединением sql, не удается извлечь записи из таблицы a, которые соответствуют некоторому условию в таблице b, и оставшиеся неучтенные записи таблицы a.

#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