【问题标题】:Find rows with column equal and other different查找列相等和其他不同的行
【发布时间】:2020-03-13 21:35:39
【问题描述】:

我需要提取具有相同列值(没有重复)的所有行和具有不同值的其他列值。

我在尝试获取空值时遇到问题,因为“具有计数(不同)”这句话不包含空值。

我的例子(https://dbfiddle.uk/?rdbms=postgres_9.4&fiddle=ae1db1de07f9a54171c5121b49112273):

create table definition
(
   job varchar(256),
   bat varchar(256),
   descr varchar(256)
);

INSERT INTO definition (job,bat,descr)
VALUES
   ('JOBA','SCRIPTA','caracoles'),
   ('JOBA','SCRIPTA','navajas'),
   ('JOBB','SCRIPTB','navajas'),
   ('JOBA','SCRIPTC','casa'),
      ('JOBC','SCRIPTC','asombrado'),
            ('JOBC','SCRIPTC','casa'),
      ('JOBC','SCRIPTKKK','asombrado'),
      ('JOBC','SCRIPTCDSFDF','pepelu'),
      ('JOBD',NULL,'casa'),
      ('JOBD','DFDSFDSFDSF','caracoles'),
   ('JOBA','SCRIPTC','casa'),
   ('JOBA','SCRIPTC','casa'),
   ('JOBJ','SCRIPTC','casa'),
   ('JOBB','SCRIPTB','love');

SELECT DISTINCT d.*
FROM definition d
JOIN
(
SELECT job
FROM definition
GROUP BY job
HAVING COUNT(DISTINCT(bat)) > 1
) x
ON d.job = x.job

它给了我:

job     bat
JOBA    SCRIPTA
JOBA    SCRIPTC
JOBC    SCRIPTC
JOBC    SCRIPTCDSFDF
JOBC    SCRIPTKKK
Warning: Null value is eliminated by an aggregate or other SET operation.

我也需要

JOBD,NULL
JOBD,DFDSFDSFDSF

【问题讨论】:

  • 结果与您编写的查询不匹配。不过,你能发布你正在使用的数据库吗
  • 为了更好地理解,您是否希望所有(工作、蝙蝠)组合至少有一个不同的描述?
  • 对不起,我的英语很差。我需要所有至少出现两次的作业,并且 bat 列的值不同。
  • 感谢脚本和 db fiddle 链接,它非常有助于制定解决方案
  • 抱歉数据库是posgree,我已经更新了主帖

标签: sql sql-server


【解决方案1】:

由于您使用的是 postgres,因此语法略有不同

SELECT DISTINCT d.job,d.bat
FROM definition d
JOIN
(
SELECT job
FROM definition
GROUP BY job
HAVING COUNT(DISTINCT(case when bat is null then '' else bat end)) > 1
) x
ON d.job = x.job
order by 1

https://dbfiddle.uk/?rdbms=postgres_9.4&fiddle=27b4cf8e44d7a088331f70ba2b519644

【讨论】:

    【解决方案2】:

    您应该在选择语句中包含 NULL 值作为 bat 字段的有效值。

    这将解决您的问题。

    SELECT DISTINCT d.*
    FROM definition d
    JOIN
    (
    SELECT job
    FROM definition
    GROUP BY job
    HAVING COUNT(DISTINCT(isnull(bat, 'N/A'))) > 1
    ) x
    ON d.job = x.job
    

    【讨论】:

    • 感谢 Dale K 帮助您正确格式化文本!我还在学习如何正确发帖。
    • 抱歉不起作用!我忘了提到那是 posgresql。使用 posgresql 不起作用:dbfiddle.uk/…
    【解决方案3】:

    我推荐exists

    select d.*
    from definition d
    where  exists (select 1
                   from definition d2
                   where d2.job = d.job and
                         d2.bat is distinct from d.bat
                  );
    

    Here 是一个 dbfiddle。

    此外,这可以利用definition(job, bat) 上的索引,并且该索引应该比具有聚合的查询更快。

    【讨论】:

    • @absolute333 。 . .我有你想要的逻辑的否定。我更新了那个答案和 SQL Fiddle。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2019-10-21
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多