如何在2个表之间进行完全连接

时间:2019-08-20 05:36:33

标签: sql

我有两个表:

表“ DATES”包含天数:

select * from dates;
click_date
------------
2019-08-14
2019-08-04
2019-07-24

表格“点击次数”包含日期,点击次数,点击次数:

select date,clicker,click_count 
from Clicks;
   date    | clicker | click_count
-----------------------------------
2019-08-04 | 3422    |           2
2019-07-24 | 3539    |           7

我需要获取所有日期的所有clicker和click_count:

    date    | clicker | click_count
------------------------------------
 2019-08-04 | 3422    |           2
 2019-08-14 | 3422    |           0
 2019-07-24 | 3422    |           0
 2019-08-04 | 3539    |           0
 2019-08-14 | 3539    |           0
 2019-07-24 | 3539    |           7

请咨询。

科比

5 个答案:

答案 0 :(得分:6)

我实际上将在此处使用交叉联接,然后再使用另一个左联接引入点击计数数据:

SELECT
    d.click_date,
    c1.clicker,
    COALESCE(c2.click_count, 0) AS click_count
FROM dates d
CROSS JOIN Clicks c1
LEFT JOIN Clicks c2
    ON d.click_date = c2.date AND c1.clicker = c2.clicker
ORDER BY
    c1.clicker,
    d.click_date;

enter image description here

Demo

注意:如果Clicks表中的给定答题器可能出现多次,请使用:

CROSS JOIN (SELECT DISTINCT clicker FROM Clicks) c1

在交叉连接之前删除重复项。

答案 1 :(得分:0)

您可以尝试执行此操作,cte部分仅用于获取不同的日期,如果您已经具有不同的日期,则可以跳过此日期。

  ; with cte as (
  select distinct click_date from dates 
  )
  select c.click_date, cl.clicker, case when c.click_date=cl.date then cl.click_count else 0 end as Counts
  from cte as c cross join Clicks as cl 
  order by cl.clicker, c.click_date

您只需要简单的cross join就可以得到想要的结果,因为我知道您的问题只与结果中的count列有关。为此,case条件足以获得所需的结果。

答案 2 :(得分:0)

左联接可以满足以下需求

      select d.date, c.clicker, Case 
     when c.click_count IS NULL Then 0
      ELSE c.click_count End 
      from dates d left join clicks c on 
      d.date=c.date;

答案 3 :(得分:0)

您希望每个日期和答题器一个结果行,因此将两者交叉连接。如果没有Clickers表,则可以从clicks表中获取Clickers。最后外部加入clicks表:

select
  dates.click_date,
  clickers.clicker,
  coalesce(clicks.click_count, 0) as clicks_count
from dates
cross join (select distinct clicker from clicks) clickers
left join clicks on clicks.date = dates.date and clicks.clicker = clickers.clicker
order by dates.click_date, clickers.clicker;

答案 4 :(得分:-1)

select date,clicker,click_count
from Clicks where date IN (select click_date from dates);