我有一个表,我需要从中获取数据,从Issues
。我正在使用名为IssueActivities
的另一个表加入问题表。因此,对于IssueID的每个实例,可能有1到多个IssueActivities。在IssueActivities
表中是一个名为Notes
的字段,它的数据类型为text
。我试图选择一个DISTINCT的IssueID的列表,其中Notes字段不包含2个特定的字符串。当使用PATINDEX时选择DISTINCT字段
这里是我的SQL:
SELECT DISTINCT i.IssueID
FROM Issues i
INNER JOIN IssueActivities ia ON i.IssueID = ia.IssueID
WHERE i.IssueStatusID = 2 --Closed issues only
AND (PATINDEX('%Pending DR%', ia.Notes) < 1 AND PATINDEX('%Pending E%', ia.Notes) < 1)
这个SQL的问题是,它返回IssueID对有因为这一事实标准的一个问题可以有许多 IssueActivities问题,所以不是所有的行都包含那个标准。那有意义吗?这里有一个简单的例子:
问题表
IssueID | IssueStatusID
-----------------------
1700 2
1701 2
IssueActivities表
IssueActivityID | IssueID | Notes
---------------------------------
1 1700 Issue Entered
2 1700 Sub Status changed from New to In Progress
3 1700 Sub Status changed from In Progress to Pending DR
4 1701 Issue Entered
5 1701 Issue Assigned
6 1701 Sub Status changed from New to Closed
因此,从上表中,我想获得,因为所有的IssueActivities的唯一的问题1701属于它,它们都不包含我正在使用的标准。
任何帮助,非常感谢。
医管局,你打我的小提琴......这里是我的(颇有几分真实数据)http://sqlfiddle.com/#!3/d853e/4。我从来没有用过APPLY,你能简单解释一下吗? – Robert
当然,APPLY是一个表值函数,你可以加入查询的每一行。有CROSS APPLY,它就像是一个内部连接,它限制了主要查询的结果集。如果在这里看到的OUTER APPLY不会限制主要查询的结果集,如果APPLY没有返回任何结果集。我发现APPLY特别适用于SELECT TOP查询,以查找基于日期时间列的最近编辑的行。这是一个很好的解释:https://www.simple-talk.com/sql/t-sql-programming/sql-server-apply-basics/ – supergrady