冗余WHERE子句?

时间:2017-11-30 12:11:56

标签: sql sql-server

问题背景:

我有一个由其他开发人员编辑过的简单存储过程。他们在有一个WHERE子句之前的某些SQL中添加了一个AND子句。开发人员现在坚持要求AND和WHERE子句都存在。

SQL:

SELECT a.NOTIFICATIONID,
a.NOTIFICATIONTYPE,
a.DESCRIPTION,
b.NOTIFICATIONID,
b.SEEN,
b.SEEN_DATE,
b.PROFILEID
FROM dbo.NOTIFICATIONS a
LEFT JOIN dbo.NOTIFICATIONSTATUS b
ON a.NOTIFICATIONID = b.NOTIFICATIONID
AND b.PROFILEID = @profileId
WHERE (b.PROFILEID = @profileId or b.PROFILEID is null)
WHERE (b.DISMISSED = 0 or b.dismissed is null) 

从我所看到的AND和WHERE子句实际上是在做同样的工作。如果存在匹配,则连接将自动过滤PROFILE_ID,并且WHERE子句将执行相同的操作。

我可以安全地假设AND或WHERE子句是必需的,但不是两者都可以吗?

1 个答案:

答案 0 :(得分:0)

在此LEFT JOIN案例中,您可以将右侧表格条件移至ON子句:

SELECT a.NOTIFICATIONID,
a.NOTIFICATIONTYPE,
a.DESCRIPTION,
b.NOTIFICATIONID,
b.SEEN,
b.SEEN_DATE,
b.PROFILEID
FROM dbo.NOTIFICATIONS a
LEFT JOIN dbo.NOTIFICATIONSTATUS b
ON a.NOTIFICATIONID = b.NOTIFICATIONID
 AND b.PROFILEID = @profileId 
 AND b.DISMISSED = 0