(可能)需要非常简单的SQL查询

时间:2018-04-23 17:44:46

标签: sql ansi-sql

缓慢的一天....可以使用一些协助编写简单的ANSI SQL查询。

我有一个家庭内的个人名单(名字和姓氏),第二张表格列出了这些人的一部分。我想创建一个第三个表,如果第二个表中没有列出任何个人,则会标记一个家庭中的每个人。目标主要是标记"不完整"家庭。

下面是两个输入表和所需第三个表的示例。

enter image description here

正如我所说的......非常简单......有一个缓慢的一天。谢谢!

3 个答案:

答案 0 :(得分:1)

我想你想要一个left joincase表达式:

select t1.*,
       (case when t2.first_name is null then 'INCOMPLETE' else 'OK' end) as flag
from table1 t1 left join
     table2 t2
     on t1.first_name = t2.first_name and t1.last_name = t2.last_name;

当然,这标志着“Diane Thomson”为“OK”,但我认为这是一个错误。

编辑:

哦,我明白了。姓氏定义了家庭(这似乎是一个非常大的假设)。但你可以用窗口函数来做到这一点:

select t1.*,
       (case when count(t2.first_name) over (partition by t1.last_name) =
                  count(*) over (partition by t1.last_name)
             then 'OK'
             else 'INCOMPLETE'
        end) as flag
from table1 t1 left join
     table2 t2
     on t1.first_name = t2.first_name and t1.last_name = t2.last_name;

答案 1 :(得分:0)

这并不简单,至少在SAS中没有: - )

标准SQL,支持窗口聚合时:

select ft.*,
  -- counts differ when st.first_name is null due to the outer join
  case when count(*) over (partition by ft.last_name)
          = count(st.first_name) over (partition by ft.last_name)
       then 'OK'
       else 'INCOMPLETE'
  end
from first_table as ft
left join second_table as st
  on ft.first_name = st.first_name
 and ft.last_name = ft.last_name

否则你需要一个标准聚合并加入回来:

select ft.*, st.flag
from first_table as ft
join 
 (
    select ft.last_name,
      case when count(*) 
              = count(st.first_name)
           then 'OK'
           else 'INCOMPLETE'
      end as flag
    from first_table as ft
    left join second_table as st
      on ft.first_name = st.first_name
     and ft.last_name = st.last_name
    group by ft.last_name
 ) as st
on ft.last_name = st.last_name

答案 2 :(得分:0)

如果您希望利用其非ANSI SQL功能自动将聚合函数结果重新合并到详细记录中,那么在SAS中很容易做到。

select
   a.first
 , a.last
 , case when 1=max(missing(b.last)) then 'INCOMPLETE' 
        else 'OK' 
   end as flag 
 from table1 a left join table2 b
   on a.last=b.last and a.first=b.first 
 group by 2
 order by 2,1
;