2012-07-27 96 views
0

我正在研究2年前持有我的职位的人员的代码,并且无法破译他们的SQL代码块。SQL Server查询解释

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语句将返回帐户的行。尽管我在选择语句时遇到了问题。我是否正确得到ACCOUNT其中ADATE比月末还要旧。原因是“CPE”还是“NPPE”,USERFLAG是“U”还是“B”?

+0

对我来说似乎是正确的。 – Kermit 2012-07-27 20:02:28

+0

虽然月末函数非常方便,但您最好使用下界包含,上界独占式日期 - 即使用'aDate> = dbo.StartOfMonth(actionDate)';这也会使您更容易与时间戳等进行比较。我对这个声明的其余部分也很好奇,因为我不能动摇这种感觉,即有潜在的优化可用。噢 - 不要为数据类型后缀列名,将它命名为它的类型很明显,比如'actionOccurredOn'或类似的(我知道你可能不能更改数据库)。 – 2012-07-27 20:10:31

+0

@ X-Zero我希望我可以发布整个SP,这样你就可以看到它有多糟糕,但不幸的是它是中间性的,因此受到HIPPA的保护。所有我继承的代码都非常糟糕,我会尽可能地称它为可笑。 – Jeremy1026 2012-07-27 20:15:34

回答

1

是的,你回来当帐户不具有如下的记录:

1)比功能dbo.Endofmonth(ACTIONDATE)返回的日期更大的ADATE

2)ReasonCPE or NPPE

3)和Userflag要么U or B

您必须查看函数dbo.Endofmonth(ACTIONDATE)中的代码才能确定它返回的内容。

1

我是正确,这是越来越户口所在ADATE比月末旧。

SELECT本身正在寻找项目,其中ADATEACTIONDATE月份结束。然后外SELECT中的NOT IN应该从ACTIONDATE检索帐户的ADATE<=月底的行。

你的其他假设看起来是正确的。

除此:看起来dbo.Endofmonth是一个用户定义的函数,而不是存储过程(或不可能像这样调用它)。