SQL Server查询解释
我正在处理一位2年多前担任我职位的人的代码,我在破译他们的SQL代码块时遇到了困难SQL Server查询解释,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我正在处理一位2年多前担任我职位的人的代码,我在破译他们的SQL代码块时遇到了困难 WHERE ACCOUNT NOT IN (SELECT ACCOUNT FROM MWAPPTS A1 WHERE A1.ACCOUNT = A.ACCOUNT AND ADATE > dbo.Endofmonth(ACTIONDATE)
WHERE ACCOUNT NOT IN (SELECT ACCOUNT
FROM MWAPPTS A1
WHERE A1.ACCOUNT = A.ACCOUNT
AND ADATE > dbo.Endofmonth(ACTIONDATE)
AND REASON IN ('CPE','NPPE')
AND USERFLAG IN ( 'U', 'B' ))
dbo.Endofmonth
是一个存储过程,它获取当月最后一天的输入日期
如果我读的是正确的,那么我们不包括显示的select语句将返回帐户的行。但是,我对select语句有问题。如果
ADATE
早于月底,则它将获得帐户
,这一点是否正确。原因是“CPE”或“NPPE”,并且USERFLAG
是“U”或“B”?是的,您返回的记录中帐户没有以下内容:
1) 大于函数dbo.Endofmonth(ACTIONDATE)
返回的日期的ADATE
2) 一个原因
,即CPE或NPPE
3) 而Userflag
是U或B
您必须查看函数dbo.Endofmonth(ACTIONDATE)
中的代码,以准确确定它返回的内容
我是正确的,它正在获得帐户,其中ADATE的时间早于月底
内部
SELECT
本身正在查找ADATE
在ACTIONDATE
月底之后的条目。外部选择中的不在中,然后应检索帐户的ADATE
所在的行,而月末函数很方便,您最好使用下限包含、上限独占样式的日期-即使用ADATE>=dbo.StartOfMonth(actionDate)
;这也会使您更容易与时间戳等进行比较。我对这句话的其余部分也很好奇,因为我无法摆脱存在潜在优化的感觉。哦-不要用数据类型作为列名的后缀,命名时要使其类型明显,比如,actionocurredon
或类似的(我知道你可能无法更改数据库)。@X-Zero我希望我可以发布整个SP,这样你就可以看到它有多糟糕,但不幸的是,它本质上是中等的,因此受到HIPPA的保护。我继承的所有代码都很糟糕,我甚至认为这很可笑。我不是法律顾问/律师,但我不认为源代码被包括在内。显然,数据是真实的,不应该被共享(尽管它可能首先被匿名化)。