SQL排除某些结果
可以说,我具有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和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和2
- 匹配表上的A值的所有的A值。
- 如果A在子查询中,则使用B = 2记录。如果不是,请使用B = 1记录。
对于示例数据和期望的结果,最简单的查询来实现结果将是一个GROUP BY
操作和一个聚合函数。
SELECT d.A
, MAX(d.B) AS B
FROM my_data_set d
GROUP BY d.A
ORDER BY d.A
如果我们只在B
列有1
或2
行有兴趣,我们可以添加一个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
惯于这项工作中的数据集下方的,1个 B,1个 C,1 d,1 d,2 E,1个 F,1- 楼2 克,1层 楼3 – sumit
@sumit:正如我在答复开始时所说的,我的建议适用于问题中给出的“*示例数据和期望结果*”。你非常正确地指出,给定一个不同的数据集,查询的返回将会不同。 (实际上,在我的答案中,第二个查询将返回给定注释中提出的数据集的答案中指定的结果。)在给定不同数据集时,在问题中没有明确指出(它含糊不清)什么结果应该返回。 – spencer7593
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
)
最有可能你会使用'EXISTS'。 –
是1,2固定值?我们可以有3个吗? – sumit