1

我有类似于我的这个问题的问题: 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 的记录。意味着它没有正确过滤。

我确实尝试使用'and'而不是'or',但使用'and'它只显示一些记录。

我在查询的某个地方错了吗?

谁能帮帮我吗 ?

4

4 回答 4

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)
于 2013-04-22T05:07:35.917 回答
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) 
于 2013-04-22T05:32:21.393 回答
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
于 2013-04-22T06:11:28.017 回答
0

我的问题得到了解决。

我使用所有 3 个表和此查询创建一个视图:

  Select * from documents d left join SR s on d.relationid = s.SRId left join Events e on d.relationid = e.EventId

而不是我在该视图上使用 where 条件来按客户过滤数据。

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

于 2013-04-22T07:20:23.197 回答