2013-08-22 72 views
0

我有一个表,我需要从中获取数据,从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属于它,它们都不包含我正在使用的标准。

任何帮助,非常感谢。

回答

0

你应该找到您要排除的行,然后在where子句中删除它们。此示例使用APPLY查找每个问题行中包含“待处理DR”或“待处理E”的任何IssueActivity行。这里是一个SQLFiddle

SELECT i.IssueID 
FROM Issues i 
OUTER APPLY(
    SELECT TOP 1 ia.IssueActivityID 
    FROM IssueActivities ia 
    WHERE ia.IssueID = i.IssueID 
    AND (PATINDEX('%Pending DR%', ia.Notes) > 0 
     OR PATINDEX('%Pending E%', ia.Notes) > 0) 
) pending 
WHERE i.IssueStatusID = 2 
    AND pending.IssueActivityID IS NULL 
+0

医管局,你打我的小提琴......这里是我的(颇有几分真实数据)http://sqlfiddle.com/#!3/d853e/4。我从来没有用过APPLY,你能简单解释一下吗? – Robert

+1

当然,APPLY是一个表值函数,你可以加入查询的每一行。有CROSS APPLY,它就像是一个内部连接,它限制了主要查询的结果集。如果在这里看到的OUTER APPLY不会限制主要查询的结果集,如果APPLY没有返回任何结果集。我发现APPLY特别适用于SELECT TOP查询,以查找基于日期时间列的最近编辑的行。这是一个很好的解释:https://www.simple-talk.com/sql/t-sql-programming/sql-server-apply-basics/ – supergrady

0

如果我理解正确的话,你需要首先选择要忽略什么:

SELECT DISTINCT IssueID 
FROM IssuesActivities 
WHERE PATINDEX('%Pending DR%', ia.Notes) > 0 OR PATINDEX('%Pending E%', ia.Notes) > 0 

然后你就可以忽略它:

SELECT DISTINCT i.IssueID 
FROM Issues i 
LEFT JOIN (SELECT DISTINCT IssueID 
      FROM IssuesActivities 
      WHERE PATINDEX('%Pending DR%', ia.Notes) > 0 OR PATINDEX('%Pending E%', ia.Notes) > 0 
     )ia 
    ON i.IssueID = ia.IssueID 
WHERE i.IssueStatusID = 2 --Closed issues only 
    AND ia.IssueID IS NULL 
0

您需要从该表只返回记录的子查询,你要包括更换您参考IssueActivities,改变连接外部的加入使返回来自Issues的所有记录,并将您的条件更改为仅返回Issues记录,其中IssueActivity查询不是有匹配记录。

SELECT DISTINCT i.IssueID 
FROM Issues AS i LEFT OUTER JOIN 
     (SELECT * FROM IssueActivities WHERE (PATINDEX('%Pending DR%', ia.Notes) < 1) 
     AND (PATINDEX('%Pending E%', ia.Notes) < 1)) AS ia ON i.IssueID = ia.IssueID 
WHERE (i.IssueStatusID = 2) AND ia.IssueID IS NULL 

您还可以使用:

SELECT i.IssueID 
FROM Issues AS i 
WHERE (i.IssueStatusID = 2) AND NOT EXISTS (SELECT * FROM IssueActivities AS ia 
WHERE (PATINDEX('%Pending DR%', ia.Notes) < 1) AND (PATINDEX('%Pending E%', ia.Notes) < 1) 
     AND (i.IssueID = ia.IssueID))) 
相关问题