如何从此查询中获得所需的结果?

时间:2013-04-22 03:50:55

标签: sql sql-server-2008

我遇到与此问题类似的问题: 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的一些记录。意味着它没有正确过滤。

我确实试过'和'代替'或'但是'和'它只显示一些记录。

我在查询的某处错了吗?

有人可以帮助我吗?

4 个答案:

答案 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

而且我正在使用该视图上的条件来过滤客户的数据。

非常感谢大家帮助我。非常感谢。