SQL - 如果包含这些其他记录,则包括此记录

时间:2013-06-29 16:50:57

标签: sql sql-server tsql

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

SELECT * FROM Policy p
JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
WHERE OtherPolicyFile.Status IN (9,10)
好的,所以这是故事。我还需要拉出Status = 11的任何OtherPolicyFile,但是如果有匹配的OtherPolicyFile,状态为9或10也是如此。

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

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

3 个答案:

答案 0 :(得分: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这样的东西?但我真的不知道)

答案 1 :(得分: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)))

答案 2 :(得分: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