我正在寻找一些有关我查询的帮助。我需要创建一个包含旧表中数据子集的新表。用于执行此操作的重要属性是groupid和类别。该类别包含具有字母和数字的字符串数据。以下是我的数据的示例:
---------------------------------------------
| groupid | category | test_results |
---------------------------------------------
| 001 | red16tall | |
| 001 | blue13small |
| 002 | green16small|
| 002 | blue16small |
| 003 | yellow3tall |
| 003 | |
| 004 | orange16tall |
| 004 | blue3tall |
| 005 | red16short |
| 005 | |
| 006 | blue3short | red16big |
| 006 | green16flat | |
| 007 | | black16fat |
| 007 | orange05big | |
------------------------------------------
我想要做的是省略任何两个记录中都有16个记录的组,并保留其他所有组。引用上面的例子,这就是我希望新表的样子:
-----------------------------
| groupid | category |
-----------------------------
| 001 | red16tall |
| 001 | blue13small |
| 003 | yellow3tall |
| 003 | |
| 004 | orange16tall |
| 004 | blue3tall |
| 005 | red16short |
| 005 | |
| 007 | | black16fat |
| 007 | orange05big | |
------------------------------------------
这是我尝试使用的查询,但这省略了其中包含16的所有内容:
create table mytable as
select *
from old_table t1
where not exists (
select 1 from old_table t2
where t1.groupid = t2.groupid
and t2.catagory like '%16%' );
任何人都可以帮我改进这段代码,还是有人知道更好的方法吗?请记住,我想保留数据集中的所有属性,我只想删除两个记录都有16的组。谢谢。
编辑:将test_results字段添加到原始表中,以及最后4条记录作为示例。除原始查询外,如何从group_id 006中排除记录?类别和test_results字段都有%16%。我还想保留测试结果为16的记录,但类别为空。
答案 0 :(得分:2)
我相信你想要这个:
create table mytable as
select t1.*
from old_table t1
where exists (select 1
from old_table t2
where t1.groupid = t2.groupid and
t2.category not like '%16%'
);
也就是说,您希望该组中某些内容的所有组都没有16
。
编辑:
对于groupid = 5
,您可以将NULL
视为不是"%16%"非常容易:
编辑:
如果category
可以是NULL
(而不是空白),那么只需在存在中包含该逻辑:
create table mytable as
select t1.*
from old_table t1
where exists (select 1
from old_table t2
where t1.groupid = t2.groupid and
(t2.category not like '%16%' or t2.category is null)
);
答案 1 :(得分:2)
我不同意接受的答案。它没有返回OP给出的期望结果:即它错误地省略了groupid'''&#39>。
我认为需要更改为以下内容:
create table mytable as
select t1.*
from old_table t1
where exists (select 1
from old_table t2
where t1.groupid = t2.groupid and
( t2.category not like '%16%'
or t2.category is null )
);