0

我有一个表Issues,我需要从中获取数据。我将问题表与另一个名为IssueActivities. 因此,对于 IssueID 的每个实例,可能有 1 到多个 IssueActivity。IssueActivities表中有一个名为的字段,Notes它是 datatype text。我正在尝试选择一个不同的 IssueID 列表,其中 Notes 字段不包含 2 个特定字符串。

这是我的 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

问题活动表

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

因此,从上表中,我只想获得问题 1701,因为属于它的所有问题活动,它们都不包含我正在使用的标准。

任何帮助是极大的赞赏。

4

3 回答 3

0

您应该找到要排除的行,然后在 where 子句中消除它们。此示例用于APPLY查找每个问题行中包含“Pending DR”或“Pending 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
于 2013-08-22T23:53:13.577 回答
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)) )
于 2013-08-22T23:55:02.957 回答
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
于 2013-08-22T23:48:28.387 回答