繁体   English   中英

SQL选择行,其中多值字段的值仅出现一次

[英]SQL Select Rows where a value of a multiple value field occurs only once

我有以下问题:

我有一个表,其中包含描述对象的不同列。 我们假设其中一列可以包含值1,2,3,4,5,6,7,8,9,10。 在这个表中,对象可以包含所有这些值,或者一些只包含例如值1,3,5(所以0到n的值)

现在我想找到只包含值1和2的所有对象,但如果它们包含1,2,3或其他组合(1,2),我不希望它们在我的结果集中。

我该如何编写这个SQL语句?

样本数据(预期结果集 - > Mark和Michael):

+---------+--------------------+---------------------------+--+
|   OBJ   | OBJ_CHARACTERISTIC | CHARACTERISTIC_DATE_ADDED |  |
+---------+--------------------+---------------------------+--+
| Mark    |                  1 |                15.01.2018 |  |
| Mark    |                  2 |                15.02.2018 |  |
| Jimmy   |                  1 |                31.01.2018 |  |
| Jimmy   |                  2 |                11.02.2018 |  |
| Jimmy   |                  4 |                15.03.2018 |  |
| Jimmy   |                  5 |                15.04.2018 |  |
| Jimmy   |                  6 |                15.04.2018 |  |
| Harry   |                  1 |                08.01.2018 |  |
| Harry   |                  2 |                11.01.2018 |  |
| Harry   |                  3 |                15.02.2018 |  |
| Michael |                  1 |                15.06.2018 |  |
| Michael |                  2 |                15.07.2018 |  |
| Dwayne  |                  4 |                15.01.2018 |  |
| Dwayne  |                  5 |                15.01.2018 |  |
| Dwayne  |                  6 |                15.01.2018 |  |
+---------+--------------------+---------------------------+--+

您可以使用分析计数来查看每个对象有多少特征,以及您要查找的特征数量; 然后比较这些计数:

select obj, obj_characteristic, characteristic_date_added
from (
  select obj, obj_characteristic, characteristic_date_added,
    count(distinct obj_characteristic) over (partition by obj) as c1,
    count(distinct case when obj_characteristic in (1,2) then obj_characteristic end)
      over (partition by obj) as c2
  from your_table
)
where c1 = c2;

使用您的示例数据,可以:

OBJ     OBJ_CHARACTERISTIC CHARACTERI
------- ------------------ ----------
Mark                     1 2018-01-15
Mark                     2 2018-02-15
Michael                  1 2018-06-15
Michael                  2 2018-07-15

从问题的方式来看,听起来你想要完整的行,如上所述; 你可能只想要这些名字。 如果是这样,您只需将外部选择更改为:

select distinct obj
from ...

OBJ    
-------
Mark
Michael

或者通过having子句使用聚合:

select obj
from your_table
group by obj
having count(distinct obj_characteristic)
  = count(distinct case when obj_characteristic in (1,2) then obj_characteristic end);

OBJ    
-------
Mark
Michael

db <>这三个小提琴演示


在这种情况下,由于1和2是连续的,您也可以使用min / max作为聚合来获取名称:

select obj
from your_table
group by obj
having min (obj_characteristic) = 1
and max(obj_characteristic) = 2;

或分析地获得完整的行:

select obj, obj_characteristic, characteristic_date_added
from (
  select obj, obj_characteristic, characteristic_date_added,
    min(obj_characteristic) over (partition by obj) as min_char,
    max(obj_characteristic) over (partition by obj) as max_char
  from your_table
)
where min_char = 1
and max_char = 2;

但早期版本更通用。

如果你只是寻找sql返回行值'1,2'而没有其他用途:

select * from table where column like '%1,2'

发布数据示例,可能更有帮助理解。

@ dwin90您可以尝试:

SELECT obj
FROM your_table
WHERE (OBJ_CHARACTERISTIC=1 OR OBJ_HARACTERISTIC=2 AND OBJ_CHARACTERISTIC !> 2
)GROUP BY OBJ

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM