Sql 如何根据特定的逻辑连接并从任一表中获取数据?

Sql 如何根据特定的逻辑连接并从任一表中获取数据?,sql,postgresql,full-outer-join,sql-null,Sql,Postgresql,Full Outer Join,Sql Null,假设我有两个表,如下所示: 表1: 表2: 我想将这两个表连接在一起,这样输出表将有一个“日期”列,表1中的一个“小时计费”列,以及表2中的一个“小时计费”列。有时一个日期只存在于其中一个表中,有时两个表中都存在一个日期。如果表1和表2中都存在一个日期,那么我想将表1中的小时账单v1和表2中的小时账单v2分配到输出表 因此理想的结果如下所示: 我尝试了“完全输出联接”,但它在输出表中为“日期”返回了一些空值。下面是我写的查询: SELECT DISTINCT CASE WHEN tabl

假设我有两个表,如下所示:

表1:

表2:

我想将这两个表连接在一起,这样输出表将有一个“日期”列,表1中的一个“小时计费”列,以及表2中的一个“小时计费”列。有时一个日期只存在于其中一个表中,有时两个表中都存在一个日期。如果表1和表2中都存在一个日期,那么我想将表1中的小时账单v1和表2中的小时账单v2分配到输出表

因此理想的结果如下所示:

我尝试了“完全输出联接”,但它在输出表中为“日期”返回了一些空值。下面是我写的查询:

SELECT 
DISTINCT CASE WHEN table1.date is null then table2.date WHEN table2.date is null then table1.date end as date, 
CASE WHEN table1.hrs_billed_v1 is null then 0 else table1.hrs_billed_v1 END AS hrs_billed_v1, 
CASE WHEN table2.hrs_billed_v2 is null then 0 else table2.hrs_billed_v2 END AS hrs_billed_v2
FROM table1         
FULL OUTER JOIN table2 ON table1.common = table2.common
请注意,我用来连接表1和表2的“common”列只是两个表中存在的常量字符串


任何建议都将不胜感激

A
full join
确实是您想要的。我认为这将是:

select 
    common,
    date,
    coalesce(t1.hrs_billed_v1, 0) as hrs_billed_v1,
    coalesce(t2.hrs_billed_v2, 0) as hrs_billed_v2
from table1 t1
full join table2 t2 using (common, date)
理由:

  • 您不显示什么是
    常见的
    ;您的数据表明您希望匹配同一日期的行-因此我将两者都放在连接条件中;你可能需要承认这一点

  • 实际上不需要
    distinct

  • coalesce()
    case
    表达式短得多

  • 当要匹配的列在两个表中具有相同的名称时,使用()
    可以方便地表示联接条件


当table1.date为空时,则为table2.date为空时,则为table1.date结束日期
可替换为
合并(table1.date,table2.date)作为日期
谢谢,@GMB。问题是有时日期只存在于一个表中,而不是同时存在于两个表中。在这种情况下,我仍然希望将这些信息放入输出表。@Stanleyrr:这正是
完全联接所做的。明白了。在这种情况下,我将使用coalesce(table1.date,table2.date)作为日期,因为有时候一个日期只存在于一个表中。因此,coalesce函数可以确保从任一表中获取任一值。@stanleyr:
完全联接允许两个表中都缺少行。例如,当
t1
中的一行在
t2
中没有匹配项时,它仍然显示在结果集中,其中
t2
中的值具有
null
coalesce()
可以将
null
值转换为
0
@stanleyr:一般来说,您是正确的。但是在这里,我们在连接条件中使用
using()
。这消除了歧义,如中所述:此外,JOIN USING的输出将抑制冗余列