Повторяющееся значение с идентификатором, которого нет в другой таблице

У меня есть 2 таблицы в Oracle:

Recipient:

id_recipient электронная почта editor_id 1 [email protected] 1 2 [email protected] 1 3 Жан@gmail.com 5 4 [email protected] 3 5 [email protected] 4 6 Павел@gmail.com 1

RecipientDeposit:

id_recipient id_deposit 3 1 4 2

Я ищу, чтобы выбрать каждую строку получателя (с тем же адресом электронной почты и тем же редактором), которая не имеет никакого значения в recipientDeposit.

С помощью этого запроса я получаю получателя, которого не существует в RecipientDeposit.

SELECT 
    re.id_recipient , re.editor_id, re.email 
FROM 
    recipient re 
WHERE 
    re.id_recipient NOT IN (SELECT rd.id_recipient 
                            FROM RecipientDeposit rd 
                            WHERE re.id_recipient = rd.id_recipient)

Я попробовал это

SELECT 
    re.id_recipient, re.editor_id, re.email 
FROM 
    recipient re 
JOIN 
    (SELECT editor_id, email 
     FROM Recipient re2 
     GROUP BY editor_id, email  
     HAVING COUNT(*) > 1) b ON re.editor_id = b.editor_id 
                            AND re.email = b.email
WHERE  
    re.id_recipient NOT IN (SELECT rd.id_recipient 
                            FROM RecipientDeposit rd 
                            WHERE re.id_recipient = rd.id_recipient)

но я правда не уверен.

каков ваш ожидаемый результат

iBeMeltin 06.08.2024 19:10

идентификатор_получателя 1, 2

robert trudel 06.08.2024 19:22

@roberttrumel Разве не это получает ваш запрос после исправления некоторых синтаксических проблем (например, псевдоним da должен быть re, а в первом подзапросе после email стоит дополнительная запятая)? dbfiddle.uk/bwWjOaBZ

Error_2646 06.08.2024 19:35

Минимальный воспроизводимый пример также должен указывать ожидаемый результат.

jarlh 06.08.2024 21:20
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
4
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте адрес электронной почты и editor_id в качестве пары, проверяющей существование в подзапросе предложения Where, который находит пары, имеющие 0 счетчиков id_recipients в таблице RecipientDeposit...

WITH  --  S a m p l e    D a t a :
    Recipient ( id_recipient, email, editor_id ) AS 
      ( Select 1,   '[email protected]',    1 From Dual Union All
        Select 2,   '[email protected]',    1 From Dual Union All
        Select 3,   '[email protected]',   5 From Dual Union All
        Select 4,   '[email protected]',    3 From Dual Union All
        Select 5,   '[email protected]',    4 From Dual 
      ), 
    RecipientDeposit ( id_recipient,    id_deposit ) AS 
      ( Select 3,   1 From Dual Union All
        Select 4,   2 From Dual 
      )
--    S Q L : 
SELECT    *
FROM      Recipient
WHERE     (email, editor_id)
                   IN  ( Select    r.email, r.editor_id
                          From      Recipient r
                          Left Join RecipientDeposit rd ON(rd.id_recipient = r.id_recipient)
                          Group By  r.email, r.editor_id
                          Having    Count(rd.id_recipient) = 0
                        )
ORDER BY  id_recipient
/*    R e s u l t :
ID_RECIPIENT EMAIL           EDITOR_ID
------------ -------------- ----------
           1 [email protected]           1
           2 [email protected]           1
           5 [email protected]           4    */

кажется, возникла ошибка, когда я запускаю ее, в результате я вижу какое-то электронное письмо, которое там есть... они уникальны, но имеют одинаковый editor_id.. вы запрашиваете возврат ID_RECIPIENT 6 и не должны

robert trudel 06.08.2024 21:46

@roberttrumel Извините, но id_recipient 6 вообще не существует.

d r 07.08.2024 00:07
Ответ принят как подходящий

Вы можете сделать это, только один раз запросив таблицу Recipient с помощью аналитических функций:

SELECT id_recipient,
       email,
       editor_id
FROM   (
  SELECT id_recipient,
         email,
         editor_id,
         COUNT(*) OVER (PARTITION BY email, editor_id) AS num_rows,
         COUNT(
           CASE
           WHEN EXISTS(
                  SELECT 1
                  FROM   RecipientDeposit rd
                  WHERE  rd.id_recipient = r.id_recipient
                )
           THEN 1
           END
         ) OVER (PARTITION BY email, editor_id) AS has_deposit
  FROM   Recipient r
)
WHERE  has_deposit = 0
AND    num_rows > 1

Что для примера данных:

CREATE TABLE Recipient (id_recipient, email, editor_id) AS
SELECT 1, '[email protected]',  1 FROM DUAL UNION ALL
SELECT 2, '[email protected]',  1 FROM DUAL UNION ALL
SELECT 3, '[email protected]', 5 FROM DUAL UNION ALL
SELECT 4, '[email protected]',  3 FROM DUAL UNION ALL
SELECT 5, '[email protected]',  4 FROM DUAL UNION ALL
SELECT 6, '[email protected]', 1 FROM DUAL;

CREATE TABLE RecipientDeposit (id_recipient, id_deposit) AS
SELECT 3, 1 FROM DUAL UNION ALL
SELECT 4, 2 FROM DUAL;

Выходы:

ID_RECIPIENT ЭЛЕКТРОННАЯ ПОЧТА EDITOR_ID 1 [email protected] 1 2 [email protected] 1

рабочий пример

Я сказал, что хочу выполнить поиск, чтобы выбрать каждую строку в получателе (с тем же адресом электронной почты и тем же редактором), которая не имеет никакого значения в получателеDeposit. Таким образом, получатель 5 не должен отображаться, поскольку адрес электронной почты и редактор не дублируются. То же самое для id_recipient 6

robert trudel 06.08.2024 22:41

@roberttrumel Объяснение вашего вопроса неясно. Однако я обновил ответ, удалив строки, в которых нет повторяющихся строк для комбинации email и editor_id.

MT0 06.08.2024 23:05

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