Проблема с сравнением двух sql-запросов с ИСКЛЮЧЕНИЕМ

#mysql #sql

Вопрос:

У меня есть два вопроса. Первый запрос возвращает 4554 результата из базы данных, а второй запрос возвращает 3830 результатов. Мне нужно извлечь и перечислить те 724 результата, которые представляют собой разницу между двумя запросами, которые существуют в первом запросе и не существуют во втором запросе. Я попытался использовать функцию EXCEPT, но в моей консоли появляется ошибка

 FOR, GROUP, HAVING, INTO expected got 'EXCEPT'
 

Любая помощь будет признательна. Вот мои вопросы.

 select * from billing_trans B,members M where (sign>='2021-03-01 00:00:00' amp;amp; sign<='2021-03-31 23:59:59') AND M.id=B.mid

EXCEPT

select * from billing_trans B,members M where (sign>='2021-03-01 00:00:00' amp;amp; sign<='2021-03-31 23:59:59') AND M.id=B.mid
AND (trans LIKE 'BH%' OR bank IN ('SM', 'TO', 'II'));
 

Комментарии:

1. Отредактируйте свой вопрос и опишите, что вы хотите сделать. Помогут примеры данных и желаемые результаты. И изучите правильный, явный, стандартный , читаемый JOIN синтаксис.

2. @GordonLinoff «Мне нужно извлечь и перечислить те 724 результата, которые представляют собой разницу между двумя запросами, которые существуют в первом запросе и не существуют во втором запросе», я думаю, что это ясно.

3. Вы уверены, что используете MySQL?

Ответ №1:

Вы можете использовать not exists . Предположительно, вы намерены:

 select *
from dt_billing_trans B join
     dt_members M
     on M.id = B.mid
where signD >= '2021-03-01' and signD < '2021-04-01' and 
      not exists (select 1
                  from dt_billing_trans b2
                  where b2.mid = b.mid and
                        b2.signD >= '2021-03-01' and
                        b2.signD < '2021-04-01' and
                        (b2.transId LIKE 'WH%' OR b2.bank IN ('WT', 'MO', 'SL'))
                 );
 

Это возвращает все транзакции для участников, у которых нет транзакций, соответствующих второму набору условий.

Это не совсем эквивалентно вашему коду (который не требуется except ни в одной базе данных), но я подозреваю, что он ближе к тому, что вы намереваетесь.

Примечание:

  • JOIN . JOIN . JOIN .
  • Обратите внимание на улучшенные сравнения дат, которые не пропускают доли секунды до полуночи. И кодирование намного проще.
  • Стандартный AND логический оператор SQL — это AND , нет amp;amp; .

Ответ №2:

Вам не нужно 2 запроса.
Используйте 1 WHERE пункт:

 SELECT * 
FROM dt_billing_trans B INNER JOIN dt_members M 
ON M.id = B.mid
WHERE (signD >= '2021-03-01 00:00:00' AND signD <= '2021-03-31 23:59:59') 
  AND NOT (transId LIKE 'WH%' OR bank IN ('WT', 'MO', 'SL'));