【问题标题】:Use SQL to show parent record FALSE if any child values are Null如果任何子值为 Null,则使用 SQL 显示父记录 FALSE
【发布时间】:2016-03-20 14:51:43
【问题描述】:

我有一组父项,每个项都有一组不确定的子项。每个子项作为一个属性,即XNULL。 (为奇怪的布尔结构道歉,但这是我必须使用的。)

Parent  Child  Attribute
------  -----  ---------
  A       1       X
  A       2       X
  A       3      NULL

  B       1       X
  B       2      NULL
  B       3      NULL

  C       1       X
  C       2       X

  D       1      NULL

  E       1      NULL
  E       2      NULL

我想根据子项将父项标识为 True 或 False。一个 NULL 值将导致该父项返回 False。以下是期望的结果:

  A       False
  B       False
  C       True
  D       False
  E       False

理想的解决方案甚至可以处理没有没有子记录的父级(结果为 False)。

我可以使用临时表来做到这一点。该解决方案相当长,我认为展示它不会为这篇文章增加任何价值。

如何使用不使用临时表的 SQL 查询来做到这一点?

我会介绍“我尝试过的事情”,但我什至不知道如何开始。

【问题讨论】:

  • 如果父母根本没有孩子怎么办?
  • 如上所述,“结果为假”。
  • 啊,是的。然后@GordonLinoff 的解决方案将起作用。

标签: sql sql-server


【解决方案1】:

我认为这不等同于nor。您只想知道是否有任何值是NULL - 或者等效地是否所有值都是'X'。使用caseaggregation

select parent,
       (case when count(*) = count(attribute) then 'true'
             else 'false'
        end)
from t
group by parent;

要处理没有孩子的父母,需要一个父母列表,与此列表分开:

select p.parent,
       (case when count(*) = count(t.attribute) and count(t.parent) > 0 then 'true'
             else 'false'
        end)
from parents p left join
     t
     on p.parent = t.parent
group by p.parent;

提醒一下,count(*) 会计算结果集中的行数。 COUNT() 带有表达式(包括一列)计算非 NULL 值的数量。当它们相同时,就没有非 NULL 值。

【讨论】:

  • OP 也想处理没有孩子的情况,所以第二个解决方案可以工作。
【解决方案2】:

您可以通过聚合来做到这一点..,当没有属性时,我将列保持为空白..

总而言之,为每一行分配真或假并获得最小值

create table #test
(
id int,
name char(2)
)

insert into #test

select 1,'x'
union all
select 1,null
union all
select 2,null
union all
select 3,''

with cte
as
(
select  id,b.*
from #test t1
cross apply
(
select case when name is null or name='' then 'False' Else 'True' end as 'chk' from #test t2 where t2.id=t1.id ) b
)
select id,min(chk)
from
cte group by id

您甚至可以删除交叉应用:

with cte
as
(
select  id,case when name is null or name='' then 'False' Else 'True' end as 'chk'
from #test t1
)
select id,min(chk)
from
cte group by id

输出:

1   False
2   False
3   False

【讨论】:

  • 这使用临时表作为存储过程或视图的一部分。正如我所说,我想在查询中处理它。
  • 我没有在查询部分处理它。这是否意味着在单个选择中
  • 这意味着使用临时查询而不是程序方法。见stackoverflow.com/a/22970/122139。这并不意味着使用单个 SELECT —— 它可能是嵌套查询,或者使用 UNION;这些很容易允许多个选择。它确实意味着不使用临时表。
  • 更正——这里的每个解决方案都使用临时查询,所以这不是问题。我不想要任何临时表——这就是问题所在。对错误的概念深表歉意。
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多