【问题标题】:how by not choosing child value, make all parent value disappear from the result set如何通过不选择子值,使所有父值从结果集中消失
【发布时间】:2016-12-05 18:57:33
【问题描述】:

我的数据如下所示:相同的PolicyNumber 可以有不同的ClassCode。那么如果至少有一个ClassCode被选择为NOT IN,那么如何消除所有包含PolicyNumberPACA1000101-00的行

如果我说WHERE ClassCode <> 01183,我希望所有这些记录都不会出现在结果集中。

【问题讨论】:

  • 双重否定令人不安。所以你想要所有类代码为 01183 的记录? (带有预期结果的样本数据!)
  • 如果 PolicyNumber 有 ClassCode 01183 我想要 PolicyNumber 和任何其他 ClassCodes(它们是 6918301183),这个 PolicyNumber 必须消失
  • 换一种说法,如果一个 policyNumber 有一个类代码 01183 的出现,那么,您希望从结果中排除该 policyNumber。这似乎是使用 not in 或 not exists 的好时机。 (不存在在更大的数据集上更快)
  • 请阅读this,了解一些改进问题的技巧。
  • 谢谢。会做。对此感到抱歉

标签: sql-server tsql notin


【解决方案1】:

使用不存在和相关子查询?

Select * 
from table T1
where not exists (Select 1 
                  from table T2 
                  where T1.PolicyNumber = T2.PolicyNumber
                    and classCode = 01183)

如果您必须连接到具有不同值的第二个表并且您需要该表中的值,则另一种方法....

SELECT T1.*, T2.*
FROM  table T1
LEFT JOIN (Select * 
           from table T2 
           classCode = 01183)
  on T1.PolicyNumber = T2.PolicyNumber
WHERE T2.PolicyNumber is null

这表示将表连接到自身,但仅包括右侧具有类代码 01183 的记录。然后 where 子句表示排除所有至少出现 1 次类代码 01183 的策略编号。

【讨论】:

  • 我刚刚尝试了你的建议,但它只显示了 PolicyNumber 和 01183 ClassCode
  • <> 更改为 = 如上所述。
  • 哦哦对不起。你说的是对的,我只是错过了=
  • 不,你的建议是对的。如果我输入<>,那就不对了。但是= 消除了整个`PolicyNumber'
  • 好的,以上就达到了预期的效果。这将从结果中排除任何具有一次或多次出现类代码 01183 的政策编号。
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2020-11-14
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多