2012-01-12 5 views
3

GUIの表示に使用される設定のリストを含むEAV SQLテーブルがあります。各プリファレンスは表の行で表されます。SQL EAVモデルで行をフィルタリングする方法は?

ColumnName/keyの列の組み合わせごとに1つの行だけをフィルタリングする必要があります。 ID_UserPersonal列がNULLでない場合は、その行がデフォルトの優先順位よりも優先されるユーザー固有の優先順位を表すことを意味します(ID_UserPersonalがNULLの場合)。その場合は、デフォルト設定をフィルタリングして除外し、ユーザ定義の設定をそのColumnName/keyの列の組み合わせで保持する必要があります。ここで

Data Rows

+0

何の結果もshoud? (あなたは単に1から始まる行番号を述べることができます) –

+0

@aF:この場合:2,3,4,5,6 – asmo

+0

更新された質問を必ずチェックしてください。私はいくつかの点を明確にした。 – asmo

答えて

4

あなたはランキング値が1ある行を選択し、非NULL値の後ID_Personal置くのNULLで行をランク付けし、このようなものでした:

; 
WITH ranked AS (
    SELECT 
    *, 
    rnk = ROW_NUMBER() OVER (
     PARTITION BY ID_Role, Section, GridName, ColumnName, [key] 
     ORDER BY CASE WHEN ID_Personal IS NULL THEN 1 ELSE 0 END, DateCreated 
    ) 
    FROM AnEAVTable 
) 
SELECT * /* or specify your columns explicitly, which is even better */ 
FROM ranked 
WHERE rnk = 1 

ROW_NUMBER()機能のPARTITION BY句に注意してください私の例では、あまりにも多くの(あるいは、おそらく、あまりにも少ない)列をそこに追加した場合に備えてです。

参考文献:

2

あなたが必要なものの完全な例です:

create table #t(
f1 int null, 
f2 int null, 
f3 int null) 

insert into #t values (1,2,3), (1,2,null), (1,3,null) 



--select the not null 
select t.* from #t t 
where t.f3 is NOT NULL 
UNION ALL 
--union with the NULL not present in the previously select 
select t.* from #t t 
inner join (select convert(varchar,f1) + convert(varchar,f2) r 
      from #t where f3 is not null) a 
      on a.r <> convert(varchar,t.f1) + convert(varchar,t.f2) 


drop table #t 

あなたはuniquellyあなたのテーブルに行を識別するフィールドの連結を作成する必要があります。

関連する問題