Выберите Данные не имеют ключа в другой таблице

у меня две таблицы 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                 |
    ------------------------------------
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
112
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать анти-объединение следующим образом:

SELECT D.DATE, R.NAME FROM DATES D
JOIN REVENUE R ON D.DATE <> R.REVDATE

Например, это принесет дату 4/11/2020.

GMB 11.12.2020 12:26

Как? Я использовал D.DATE

Popeye 11.12.2020 12:27
Ответ принят как подходящий

Вы можете сгенерировать все комбинации дат и имен с помощью 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

Demo

Другие вопросы по теме