我先有两张桌子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
答案 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')