select * from(select * from table)

时间:2015-03-27 14:37:13

标签: sql select

我有一张表,记录顾客是否在其帐户上标记了某个标志。当标记被标记时,它将标志添加到patronflag表,即

patronid   flagnumber   flagvalue
     123          200           1

如果顾客从未有过这面旗帜,他们就没有列在顾客表格中。

我使用以下查询来查找标志为1而不是标志2的顾客。我未能弄清楚的是如何获得patronfirst和patronlast名称以便我可以发送报告。 patronid是主要的,而patronfirst和patronlast是领域。

select getpik(patronid) from
(
Select pf.patronid from patronflags pf, pers p where pf.patronid = p.id_pers and pf.flagnumber = '2'

minus

Select pf.patronid from patronflags pf, pers p where pf.patronid = p.id_pers and pf.flagnumber = '2'
)

1 个答案:

答案 0 :(得分:3)

我更喜欢使用group byhaving找到标志为1但不是标志2的顾客:

  select pf.patronid
  from patronflags pf 
  group by pf.patronid
  having sum(case when pf.flagnumber = '1' then 1 else 0 end) > 0 and
         sum(case when pf.flagnumber = '2' then 1 else 0 end) = 0

您可以将其用作子查询,并加入人员信息:

Select p.*
from (select pf.patronid
      from patronflags pf 
      group by pf.patronid
      having sum(case when pf.flagnumber = '1' then 1 else 0 end) > 0 and
             sum(case when pf.flagnumber = '2' then 1 else 0 end) = 0
     ) pf join
     pers p
     on pf.patronid = p.id_pers ;

您应该学习正确的join语法。切勿在{{1​​}}子句中使用逗号。