如何从不同值中的列中获取特定值的数据

时间:2015-05-05 04:54:22

标签: sql oracle plsql

与我的要求相关的示例。 我有一张桌子t_policies_details 列pol_ref,inrtyp

inrtyp has values = ORD,PPC,AVCO,DSS,RVP, SP,TV 

我想获取polref,其中inrtyp只有SP和TV,没有任何其他。

SELECT DISTINCT p.polref, p.inrtyp FROM t_policies_details p WHERE p.inrtyp NOT IN ('ORD')
INTERSECT
SELECT DISTINCT p.polref, p.inrtyp FROM t_policies_details p WHERE p.inrtyp NOT IN ('PPC')
INTERSECT
SELECT DISTINCT p.polref, p.inrtyp FROM t_policies_details p WHERE p.inrtyp NOT IN ('AVCO')
INTERSECT
SELECT DISTINCT p.polref, p.inrtyp FROM t_policies_details p WHERE p.inrtyp NOT IN ('DSS')
INTERSECT
SELECT DISTINCT p.polref, p.inrtyp FROM t_policies_details p WHERE p.inrtyp NOT IN ('RVP') 

我尝试过以上查询,排除不需要的东西,     但这给了我polref,它有SP或TV,或两者兼而有之。我必须再次搜索哪两个都有。     我通过搜索找到了一些。     但是当我把条件包括在内时:

INTERSECT
SELECT DISTINCT p.polref, p.inrtyp FROM t_policies_details p WHERE p.inrtyp IN ('SP')
INTERSECT
SELECT DISTINCT p.polref, p.inrtyp FROM t_policies_details p WHERE p.inrtyp IN ('TV')

我没有得到任何polref。

请帮助我做到这一点。

4 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望所有polref具有inrtyp的实例同时用于'电视','SP',但根本没有其他值。您可以计算组中所需和不需要的实例数,然后在外部选择中应用逻辑:

WITH cte AS
(
  SELECT p.polref,
       SUM(CASE WHEN p.inrtyp IN ('TV', 'SP') THEN 1 ELSE 0 END) AS Good, 
       SUM(CASE WHEN p.inrtyp NOT IN ('TV', 'SP') THEN 1 ELSE 0 END) AS Bad
  FROM t_policies_details p
  GROUP BY p.polref
)
SELECT cte.polref
FROM cte
WHERE Good = 2 AND Bad = 0;

SqlFiddle here

答案 1 :(得分:0)

从您选择的列列表中删除p.inrtyp,这样就可以了。如果您在where子句中使用列,则不必显示在选定的列列表中。您将获得符合条件的pol_refs列表

SELECT DISTINCT p.polref FROM t_policies_details p WHERE p.inrtyp NOT IN ('ORD')
INTERSECT
SELECT DISTINCT p.polref FROM t_policies_details p WHERE p.inrtyp NOT IN ('PPC')
INTERSECT
SELECT DISTINCT p.polref FROM t_policies_details p WHERE p.inrtyp NOT IN ('AVCO')
INTERSECT
SELECT DISTINCT p.polref FROM t_policies_details p WHERE p.inrtyp NOT IN ('DSS')
INTERSECT
SELECT DISTINCT p.polref FROM t_policies_details p WHERE p.inrtyp NOT IN ('RVP')
INTERSECT
SELECT DISTINCT p.polref FROM t_policies_details p WHERE p.inrtyp IN ('SP')
INTERSECT
SELECT DISTINCT p.polref FROM t_policies_details p WHERE p.inrtyp IN ('TV')

答案 2 :(得分:0)

请尝试以下查询。这可能对你有帮助

查询:

SELECT DISTINCT p.polref, p.inrtyp
FROM t_policies_details p
WHERE p.inrtyp = ALL ('SP','TV');

答案 3 :(得分:0)

请尝试以下查询。

查询:

SELECT DISTINCT p.polref,p.inrtyp FROM t_policies_details p p.inrtyp in('SP','TV');