2

在这里过度简化,但我需要帮助。假设我有一个这样的 SQL 语句:

SELECT * FROM Policy p
JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
WHERE OtherPolicyFile.Status IN (9,10)

好的,故事就讲到这里。我还需要提取 Status = 11 的任何 OtherPolicyFile,但前提是存在状态为 9 或 10 的匹配 OtherPolicyFile。

换句话说,我通常不会拉取状态为 11 的 OtherPolicyFile,但如果该策略也有状态为 9 或 10 的 OtherPolicyFile,那么我还需要拉取状态为 11 的任何 OtherPolicyFiles。

可能有一个非常简单的方法来写这个,但我现在很疲惫,如果不跳过箍,它就不会来找我。任何帮助,将不胜感激。

4

3 回答 3

3

执行一个额外的左连接并测试左连接表是否为 NULL:

SELECT p.*, o.* 
FROM Policy p
    JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
    LEFT JOIN OtherPolicyFile o9or10 
        on o9or10.PolicyId = p.PolicyId and o9or10.Status IN (9,10)
WHERE o.Status IN (9,10)
    OR o.Status = 11 AND o9or10.PolicyId is NOT NULL
GROUP BY <whatever key you need>

但请注意 - 您需要使用 GROUP BY 以便添加的 LEFT JOIN 不会重复行。我无法提出正确的密钥,因为我不知道您的架构,因此请填写适当的密钥(可能是 OtherPolicyFile 的主 ID?所以在您的情况下类似于 o.ID?但我真的不知道)

于 2013-06-29T17:04:32.773 回答
2

我会添加一个子查询来查看是否存在 9 或 10。这是小提琴:http ://sqlfiddle.com/#!3/1a68c/2

SELECT * FROM Policy p
JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
WHERE o.Status IN (9,10)
OR (o.Status = 11 AND
    exists (select * from OtherPolicyFile innerO 
              where innerO.PolicyId = p.PolicyId 
              and (innerO.Status = 9 or innerO.Status=10)))
于 2013-06-29T16:59:47.173 回答
2

我相信这将提供最好的性能。注意没有连接。

它只会在 sql server 2005+ 上执行

请注意,您不能“选择 *”并在两个表中使用相同的列名才能使其正常工作。所以你必须指定你需要哪些列。

SELECT * from 
(
  SELECT  <your columns>, 
  statuscheck = min(nullif(o.status, 11)) over (partition by o.PolicyId)
  FROM Policy p
  JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
  WHERE o.Status IN (9,10,11)
) a
WHERE statuscheck is not null
于 2013-06-29T17:38:57.703 回答