Как удалить дубликаты в sql JOIN при получении нескольких строк из нескольких таблиц - PullRequest
2 голосов
/ 26 февраля 2020

Мой проект связан с блогом, в котором люди публикуют статьи и получают еженедельные вознаграждения в зависимости от охвата постов за последнюю неделю, рекламы и т. Д. *

для определенной ситуации. Мне нужен запрос, который возвращает несколько строк из трех таблиц, проблема в том, что когда я использую JOIN, есть несколько дубликатов, и я не могу найти решение для их удаления.

Таблицы структурированы следующим образом:

Таблица 1: Пользователи

  ID      | Name      | Age

  1       | Mark      | 16
  2       | Michael   | 21

Таблица 2: Сообщения

 userID      | postID   | Title

     1       | A1       | Inflation : A simplified Approach
     1       | A2       | The "un-winnable" game of politics
     2       | A3       | What is Bourgeoisie ?
     2       | A4       | The radical views of Carl Marx
     2       | A5       | Anna Karenina, or the greatest novel in history

Таблица 3: Доход

   userID     | weekRevenue  

      1       | $0.2    
      1       | $0.14       
      1       | $0.91 
      1       | $1.72 
      2       | $0.99 

Все, что мне нужно, - это запрос, который возвращает следующее:

 ID    | postID    | weekRevenue

 1     | A1        | $0.2
 1     | A2        | $0.14
 1     | 'Null'    | $0.91
 1     | 'Null'    | $1.72
 2     | A3        | $0.99
 2     | A4        | 'Null'
 2     | A5        | 'Null'

, то есть: возвращает значения из всех таблиц без дублирования какого-либо значения и без привязки какого-либо поля из две таблицы, но к полю ID в таблице Users

это вообще возможно? Если нет, то каков подход к достижению чего-то близкого к тому, что я прошу?

Мой подход (который, очевидно, потерпел неудачу) заключался в использовании JOIN, а вот мой запрос

Select A.ID,B.postID,C.weekRevenue
from Users A
left join Posts B
on A.ID=B.userID
left join Revenue C
on A.ID=C.userID;

, и возвращение было:

 ID    | postID    | weekRevenue

 1     | A1        | $0.2
 1     | A1        | $0.14
 1     | A1        | $0.91
 1     | A1        | $1.72
 1     | A2        | $0.2
 1     | A2        | $0.14
 1     | A2        | $0.91
 1     | A2        | $1.72
 2     | A3        | $0.99
 2     | A4        | $0.99
 2     | A5        | $0.99

Я также пытался Right JOIN, inner и их комбинации без существенных изменений в возвращаемой таблице.

любое предложение будет полезным, большое спасибо заранее.

1 Ответ

0 голосов
/ 26 февраля 2020

Вам не нужны результаты в «реляционном» формате, потому что столбцы в строке не имеют отношения друг к другу. Тем не менее, вы можете делать то, что вы хотите, используя row_number() и union all:

select id, max(postid) as postid, max(weekrevenue) as weekrevenue
from ((select id, postid, null as weekrevenue,
              row_number() over (partition by id order by postid) as seqnum
       from posts
      ) union all
      (select id, null as postid, weekrevenue,
              row_number() over (partition by id order by weekrevenue) as seqnum
       from revenue
      )
     ) pr
group by id, seqnum;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...