2016-03-20 14 views
0

親アイテムのコレクションがあり、それぞれに不確定な子アイテムのセットがあります。各子アイテムは、属性としてXまたはNULLです。 (奇数ブール構造のための謝罪が、それは私が仕事をしなければならないものだ。)子レコードの値がNullの場合は、SQLを使用して親レコードを表示します。

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として親項目を識別します。 1つのNULL値は、その親アイテムに対してFalseリターンを返します。ここで目的の結果は以下のとおりです。

A  False 
    B  False 
    C  True 
    D  False 
    E  False 

でも(結果がFalse)子レコードを持たない親を扱うことになる理想的なソリューション。

これは、一時テーブルを使用して行うことができます。その解決策はかなり長く、私はそれを提示することはこのポストに価値を加えるだろうとは思わない。

一時テーブルを使用しないSQLクエリでこれを行うにはどうすればよいですか?

私は「試したこと」を提示しますが、始める方法は十分に分かりません。

+0

親に子供がまったくない場合はどうなりますか? –

+0

上記のとおり、結果はFalseです。 – Smandoli

+0

ああ、そうです。それで@GordonLinoffの解決策が働くでしょう。 –

答えて

2

私はこれがnorに相当するとは思いません。任意の値がNULLであるかどうか、つまりすべての値が'X'であるかどうかを知りたいだけです。 caseaggregationを使用します。その結果におけるリマインダー、count(*)カウント行の数として

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; 

を:

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

いない子供を持つ親に対処するには、このリストは別に、両親のリストが必要ですセット。式を持つCOUNT()(列を含む)は、NULLでない値の数を数えます。これらが同じ場合、NULL以外の値はありません。何の属性が、私は空白の列を守っていないとき

+0

OPは子供がいない場合も処理したいので、2番目のソリューションが動作します。 –

1

あなたは... ..集計を経てこれを行うことができ

要約すると最小値の各列に真または偽の割り当てと取得

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 
+0

これは、ストアドプロシージャの一部として、または可能であればビューを使用して一時テーブルを使用します。私が言ったように、私はそれをクエリで処理したい。 – Smandoli

+0

私はクエリ部分でそれを処理しませんでした。これは単一の選択でこれを意味します – TheGameiswar

+0

これは手続き型アプローチの代わりにアドホッククエリを使用することを意味します。 http://stackoverflow.com/a/22970/122139を参照してください。これは、単一のSELECTを使用することを意味するのではなく、クエリをネストするか、またはUNIONを使用することができます。これらは複数のSELECTSを容易に許可します。それは、一時表を使用しないことを意味します。 – Smandoli

関連する問題