у меня две таблицы 1- Таблица дат
------------
| Date |
------------
| 1/11/2020 |
-----------
| 2/11/2020 |
------------
2- Доходы
------------------------------------
| revDate | Name | Revenue |
------------------------------------
| 1/11/2020 | Joe | 500 $ |
------------------------------------
| 2/11/2020 | Dani | 400 $ |
------------------------------------
| 4/11/2020 | Sami | 300 $ |
------------------------------------
Мне нужен запрос, чтобы вернуть имя пользователя, а не представить доход в таблице дат запрос должен вернуть:
------------------------------------
| Date | UserNotSubmit |
------------------------------------
| 1/11/2020 | Dani |
------------------------------------
| 1/11/2020 | Sami |
------------------------------------
| 2/11/2020 | Joe |
------------------------------------
| 2/11/2020 | Sami |
------------------------------------
Вы можете использовать анти-объединение следующим образом:
SELECT D.DATE, R.NAME FROM DATES D
JOIN REVENUE R ON D.DATE <> R.REVDATE
Как? Я использовал D.DATE
Вы можете сгенерировать все комбинации дат и имен с помощью cross join
, а затем отфильтровать существующие:
select d.date, n.name
from dates
cross join (select distinct name from revenues) n
where not exists (select 1 from revenues r where r.revdate = d.date and r.name = n.name)
Вы можете рекурсивно применить CROSS JOIN
, а затем LEFT JOIN
, например
SELECT rr.revDate AS Date, rr.Name AS UserNotSubmit
FROM
( SELECT r1.revDate, r2.Name, r1.Name AS Name2
FROM Revenues r1
CROSS JOIN Revenues r2) rr
LEFT JOIN Revenues r3
ON r3.revDate != rr.revDate
AND r3.Name = rr.Name
WHERE r3.revDate IS NOT NULL
ORDER BY rr.revDate
Обновление. Действительно, приведенный выше запрос выводит все несовпадающие записи без необходимости в таблице Date
, но если вы хотите отфильтровать из-за совпадающих значений столбца Date
таблицы Date
, тогда примените простой (INNER
) JOIN
, например
WITH Rev AS
(
SELECT rr.revDate AS Date, rr.Name AS UserNotSubmit
FROM
( SELECT r1.revDate, r2.Name, r1.Name AS Name2
FROM Revenues r1
CROSS JOIN Revenues r2) rr
LEFT JOIN Revenues r3
ON r3.revDate != rr.revDate
AND r3.Name = rr.Name
WHERE r3.revDate IS NOT NULL
)
SELECT r.*
FROM Rev r
JOIN Date d
ON d.Date = r.Date
ORDER BY r.Date
Например, это принесет дату
4/11/2020
.