我有一个查询返回多个记录,这些记录成对出现。记录对列中的一些信息与前面的ID和年份相同,但其他信息具有不同的值,前列名称类型可能为空,另一个为'A'。SQL帮助省略记录
如果第三列类型等于'A'或其中一个对的另一个任意字符串,我该如何去排除SQL查询的WHERE部分中具有相同ID和年份的记录?我在想一个案例陈述可能会被使用,但我不确定。
我有一个查询返回多个记录,这些记录成对出现。记录对列中的一些信息与前面的ID和年份相同,但其他信息具有不同的值,前列名称类型可能为空,另一个为'A'。SQL帮助省略记录
如果第三列类型等于'A'或其中一个对的另一个任意字符串,我该如何去排除SQL查询的WHERE部分中具有相同ID和年份的记录?我在想一个案例陈述可能会被使用,但我不确定。
您可以使用NOT EXISTS和子查询...
SELECT id, year
FROM table t
WHERE NOT EXISTS (SELECT * FROM table t2
WHERE ThirdColumn = 'A'
AND t2.id = t.id
AND t2.year = t.year)
,这将导致(2)表扫描,不是非常优化的解决方案 –
可以有超过2相同的ID,比如说可以有8个,但每年只能返回2个,所以每年有2个相同的ID。如果我这样做,那么其他年份的所有其他ID也不会被退回,我怎么能在年份和ID都包括在内呢?我将需要将此语句移植到水晶语法,但现在只需获取SQL查询将启动我。 –
@ K Ivanov - 如果他没有这些领域的索引,那么有更大的问题... – JNK
并非如此简单。
select t.*
from tbl t
left join (
select t2.id, t2.year
from tbl t2
group by t2.id, t2.year
having count(*) > 1 and
count(case when type='A' then 1 end) *
count(case when type='A' then null else 1 end) > 0
) X
on X.id = t.id and X.year = t.year
WHERE X.id is null
count(*) > 1
有助于我们认为那里是至少具有相同ID的一对/年count(case..) > 0
■确定说,“type
S的至少一个是‘A’,并在至少一个不LEFT JOIN + WHERE IS NULL
是一个典型的技术只显示在左连接失败的数据,即ID /符合子查询的条件,对年度取出
是的,你可以使用大小写,并在最后过滤,如果你提供一些样本,我们可以给你更准确的答案 –