#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'));