来自sql server的必需数据

时间:2018-02-20 13:04:39

标签: sql sql-server

我先有两张桌子Exhibitor_Details&另一个是Form_Status。在Form_Status表中,一列Status的值为Read, Draft, Submitted。如果打开了一个表单,那么该表单的status将为Read&如果参展商提交该表格,则状态将变为submitted

这两个表都与Exhibitor_Details.ID相关联。如果参展商没有打开该表格(即表格未读),我们没有为status列值指定任何值,因此如果参展商打开该表格,则该值将被插入Status栏。

如果我有10个参展商&在10个参赛者中,有两个参展商打开了表格(status=Read),两个参展商保存为草稿(status=draft)&其他6个没有打开它(Status不是由我们提供的,所以Form_Status表中没有此记录。

我希望通过加入进行SQL查询,除了status=submitted之外,所有参展商数据都会出现,但我的问题是form_status中剩余的6个参展商详细信息不可用,那么这6条记录不会出现。

我的查询是

Select Distinct Exhibitor_Details.ID,Exhibitor_Details.Banner_Name,Form_Status.Exhibitor_ID,Form_Status.Status,Form_Status.Form_ID
from Exhibitor_Details
left join Form_Status on Exhibitor_Details.ID=Form_Status.Exhibitor_ID
where Exhibitor_Details.Edition_ID=1142 and Form_Status.Edition_ID=1142  and Form_Status.Status not in ('Submitted')
order by Form_Status.Exhibitor_ID asc

1 个答案:

答案 0 :(得分:0)

尝试更改:

left join Form_Status 
    on Exhibitor_Details.ID=Form_Status.Exhibitor_ID

为:

left join Form_Status
   on Exhibitor_Details.ID = Form_Status.Exhibitor_ID
   and Form_Status.Status != 'Submitted'

并删除:

and Form_Status.Status not in ('Submitted')

如果你有LEFT JOIN然后在WHERE子句中使用'right hand'表,它通常会有效地成为INNER JOIN。

如果涉及到NULL,你还需要小心使用NOT IN ......

可重新运行的示例......最终语句中的LEFT JOIN由WHERE子句“打破”。

declare @t1 table (id int, txt varchar)
declare @t2 table (id int, txt varchar)

insert into @t1
select '1', 'a' union
select '2', 'b'

insert into @t2
select '1', 'c'

select *
from @t1 a
inner join @t2 b on a.id = b.id

select *
from @t1 a
left join @t2 b on a.id = b.id

-- BROKEN
select *
from @t1 a
left join @t2 b on a.id = b.id
where b.txt not in ('d')