2016-12-29 150 views
0

可以说,我具有SQL排除某些结果

A B 
-- -- 
a 1 
b 1 
c 1 
d 1 
d 2 
e 1 
f 1 
f 2 
g 1 

的数据组如何将我排除在第1列B中的结果,如果B列同时具有图1和2的值在列中的相同的值一个?

我想我的结果看起来像这样

A B 
-- -- 
a 1 
b 1 
c 1 
d 2 
e 1 
f 2 
g 1 
+1

最有可能你会使用'EXISTS'。 –

+0

是1,2固定值?我们可以有3个吗? – sumit

回答

0

检查明确这里的值1和2以及使用的事实,恰好有两个。如果可以安全地假定你总是想要最高价值,那么你可能会使这个问题变得不那么麻烦。

select 
    tbl.A, 
    tbl.B 
from 
    Table1 tbl 
    left outer join (
    select 
     A 
    from 
     Table1 
    where 
     B in (1,2) 
    group by 
     A 
    having 
     count(B) = 2 
) mlt on tbl.A = mlt.A 
where 
    (
    mlt.A is not null 
    and tbl.B = 2 
) or (
    mlt.A is null 
    and tbl.B = 1 
) 
  1. 图出同时具有1和2
  2. 匹配表上的A值的所有的A值。
  3. 如果A在子查询中,则使用B = 2记录。如果不是,请使用B = 1记录。
0

对于示例数据和期望的结果,最简单的查询来实现结果将是一个GROUP BY操作和一个聚合函数。

SELECT d.A 
     , MAX(d.B) AS B 
    FROM my_data_set d 
    GROUP BY d.A 
    ORDER BY d.A 

如果我们只在B列有12行有兴趣,我们可以添加一个WHERE条款

SELECT d.A 
     , MAX(d.B) AS B 
    FROM my_data_set d 
    WHERE d.B IN (1,2) 
    GROUP BY d.A 
    ORDER BY d.A 

与示例数据,输出是一样的。

这两个语句都达到了指定的结果。 (目前为A每个不同的值只有返回行。)


或者,相同的数据。例如,我们可以返回相同的结果具有更字面实施规范设置。

要排除1行时存在与2一排的A相同的值,我们可以使用一个NOT EXISTS谓词和相关子查询。

SELECT d.A 
     , d.B 
    FROM my_data_set d 
    WHERE (d.B = 2) 
    OR (d.B = 1 AND 
      NOT EXISTS (SELECT 1 
          FROM my_data_set e 
          WHERE e.A = d.A 
          AND e.B = 2 
         ) 
     ) 
    ORDER BY d.A, d.B 
+0

惯于这项工作中的数据集下方的,1个 B,1个 C,1 d,1 d,2 E,1个 F,1- 楼2 克,1层 楼3 – sumit

+0

@sumit:正如我在答复开始时所说的,我的建议适用于问题中给出的“*示例数据和期望结果*”。你非常正确地指出,给定一个不同的数据集,查询的返回将会不同。 (实际上,在我的答案中,第二个查询将返回给定注释中提出的数据集的答案中指定的结果。)在给定不同数据集时,在问题中没有明确指出(它含糊不清)什么结果应该返回。 – spencer7593

0
select 
* from tbl where a IN 
(

select 

a from tbl 
group by a 
having count(*)>1 
) 
and b!=1 

UNION ALL 

select 
* from tbl where a IN 
(

select 

a from tbl 
group by a 
having count(*)=1 
)