0

特定のユーザーが選択した値を保持する構成テーブルがあります。入力された値がない場合は、デフォルトが返されます。ただし、落とし穴があります。ユーザーは特定のグループに属しており、各グループには独自のデフォルトがあります。

必要なのは、ユーザーの値を返す単一のクエリ、またはデータが見つからない場合はユーザーのグループのデフォルトです。

構成テーブルの構造は非常に単純です。

CONFIGURATION: ConfigurationId (PK), GroupId (FK), UserId (FK), ConfigurationDetailId (FK);
CONFIGURATIONDETAIL: ConfigurationDetailId (PK), ConfigValue1, ConfigValue2

ユーザーは複数のグループに属し、それぞれの構成が異なる場合があります。これらの構成は、値が同じであっても、異なると見なされます(独自のConfigurationDetailIdがあります)。データを探すとき、私は常にGroupIdとUserIdを持っています

これは機能しますが、もっと「エレガント」なものが欲しかったのです...私が気に入らないのは、TOP1とORDERBYです。ユーザー固有の行が存在する場合は、デフォルトの行を削除する必要があります。

SELECT TOP 1 
  FROM Config C
 WHERE C.GroupId = @GroupId
   AND (C.UserId = @UserId OR C.UserId IS NULL)
 ORDER BY C.UserId DESC

何かご意見は?

4

1 に答える 1

3

テーブル構造によっては、おそらく自己結合を試してください。

create table config
 ( GroupID int, 
   UserID int, 
   ConfigId int, 
   ConfigValue varchar(50),
   IsDefault int );

insert into config (groupid, userid, configid, configvalue, isdefault)
values (1, NULL, 1, 'A', 1);
insert into config (groupid, userid, configid, configvalue, isdefault)
values (1, NULL, 2, 'B', 1);
insert into config (groupid, userid, configid, configvalue, isdefault)
values (1, NULL, 3, 'C', 1);
insert into config (groupid, userid, configid, configvalue, isdefault)
values (1, 1, 1, 'A1', 0);
insert into config (groupid, userid, configid, configvalue, isdefault)
values (1, 1, 2, 'B1', 0);
insert into config (groupid, userid, configid, configvalue, isdefault)
values (1, 1, 3, 'C1', 0);
insert into config (groupid, userid, configid, configvalue, isdefault)
values (1, 2, 1, 'A2', 0);

select 
   COALESCE(c1.configid, c2.configid) as configid,
   COALESCE(c1.configvalue, c2.configvalue) as configvalue
from config c1 right join config c2
 on (c1.groupid = c2.groupid 
     and c1.configid = c2.configid
     and c1.isdefault = 0 and c1.userid = 2)
where c2.isdefault = 1 and c2.groupid = 1;

select 
   COALESCE(c1.configid, c2.configid) as configid,
   COALESCE(c1.configvalue, c2.configvalue) as configvalue
from config c1 right join config c2
 on (c1.groupid = c2.groupid 
     and c1.configid = c2.configid
     and c1.isdefault = 0 and c1.userid = 1)
where c2.isdefault = 1 and c2.groupid = 1;

ユーザー ID = 2 の結果

CONFIGID    CONFIGVALUE
1           A2
2           B
3           C

ユーザー ID = 1 の結果

CONFIGID    CONFIGVALUE
1           A1
2           B1
3           C1

このためにSQLFiddleを作成したので、自分で確認してください。

于 2012-06-14T14:56:42.533 に答える