我遇到与此问题类似的问题: sql server 2008 case statement in where clause not working
我有相同的文档,SR和事件表。
我的文档表结构如下:
documentid int,
documenttype nvarchar(50),
relationid int,
document image,
docdate date
和SR表结构:
SRId int,
CustomerId int, ( related to customer table)
SRdetail,
SRDate
和事件表:
EventId int,
SRId int, (related to SR table)
Event,
EventDate
我使用此查询正确获取了所有行:
Select *
from documents d
left join SR s on d.relationid = s.SRId
left join Events e on d.relationid = e.EventId
但我也必须做过滤。比如我需要按客户显示所有文件。
所以我正在执行这样的查询:
Select *
from documents d
left join SR s on d.relationid = s.SRId
left join Events e on d.relationid = e.EventId
where (s.CustomerId = 123 or
e.SRId in (select SRId from SR where CustomerId = 123))
但它没有给我正确的输出。它显示了差异客户事件和客户SR的一些记录。意味着它没有正确过滤。
我确实试过'和'代替'或'但是'和'它只显示一些记录。
我在查询的某处错了吗?
有人可以帮助我吗?
答案 0 :(得分:0)
我认为你只需要将左连接更改为内连接 当你想过滤数据时,过滤左边的连接不会做任何事情
Select *
from documents d
left join SR s on d.relationid = s.SRId and d.documenttype = 'sr'
left join Events e on d.relationid = e.EventId and d.documenttype = 'event'
where s.CustomerId = 123 or
e.SRId in (select SRId from SR where CustomerId = 123)
答案 1 :(得分:0)
和e.SRID = s.SRID cond将始终匹配
关于上述评论,我猜是:
Select * from documents d
left join SR s on d.relationid = s.SRId
left join Events e
on d.relationid = e.EventId
where
(s.CustomerId = 123 AND e.SRID=s.SRID)
答案 2 :(得分:0)
尝试:
Select *
from documents d
left join SR s on d.relationid = s.SRId and s.CustomerId = 123
left join Events e
join SR se on e.SRId = se.SRId and se.CustomerId = 123
on d.relationid = e.EventId
where coalesce(s.CustomerId, se.CustomerId) = 123
答案 3 :(得分:0)
我的问题解决了。
我使用所有3个表和此查询创建一个视图:
Select * from documents d left join SR s on d.relationid = s.SRId left join Events e on d.relationid = e.EventId
而且我正在使用该视图上的条件来过滤客户的数据。
非常感谢大家帮助我。非常感谢。