2016-09-29 1 views
1

私は何をしようとしているのかよく説明できませんが、TSQL - AとBの列を一覧表示するクエリ、左側の結合、メインテーブルを維持する

私は表Bのウィッヒに一連のパラメータは、各ユーザーとそのアクセス権が含まれているテーブルAを持っています。

Woot?

表ユーザ
ユーザーID、名前

テーブルパラメータ
ParamterId、ParameterNameが

表権限
PermissionId、ParameterId、ユーザーID、X、Y、Z(X、 Y、Zはすべてブール値)

です私が欲しいのは、ユーザごとに、その許可を持っているかどうかにかかわらず、すべてのパラメータのリスト。

これは次のようなものです。

SELECT 

p.ParameterName, 
pm.X, 
pm.Y, 
pm.Z 

FROM Parameters p 
LEFT JOIN Permissions pm ON pm.PermissionId = p.Id 
AND (pm.UserId IS NULL OR pm.UserId = @UserId) 

基本的には、すべてのパラメータが必要です。私が提供しているユーザーがいるかどうかを知る必要があります。

LEFTは

...私のために非常にうまく機能しなかったユーザーが、そのための権限を持っていないとき、それは私にすべてのパラメータを取得していないJOINのBUT。

私はこのようにすることができました。

SELECT 

p.ParameterName, 
(SELECT X FROM Permissions WHERE ParameterId = p.Id And UserId = @UserId) [X] 
-- *repeat logic for Y and Z* 

FROM Parameters p 

2番目のクエリはうまく動作しますが、品質とパフォーマンスはあまり良くありません。私のテーブル構造が私ができる最高のものかどうかはわかりません。

私は、行ごとにそれを行う代わりに、1行のすべての権限タイプをやって考えました。

何かが好きです。

実際 - 権限
PermissionId、ParameterId、ユーザーID、X、Y、Z。(XYZビット/ブール値)Iは、最初考え

何か - 権限 PermissionId、ParameterId、ユーザーID、タイプ
(型はX、Y、Zを含むenumでした)。しかし、この論理を使用すると、すべてのアクセス権を一緒に照会することで問題が増えるため、1行に入れるとより良いことができると思いました。

私は自分の問題と私が必要としていることを説明することができましたか?

私は何か他に何かできますか、または2番目のクエリが正常に機能していますか?

ありがとうございました。初見の左に

+0

は、pm.ParameterId = p.Id –

答えて

1
SELECT 
    p.ParameterName, 
    pm.X, 
    pm.Y, 
    pm.Z 
FROM Parameters p 
LEFT JOIN Permissions pm ON pm.ParameterId = p.Id 
AND (pm.UserId IS NULL OR pm.UserId = @UserId) 
+0

フリックのパーミッション午後のJOINままにしておく必要があり間違って登録しよう。私は恥ずかしいです。私はwhere節をすべて間違ってしまった、少なくとも私は心の中で正しい、笑った。ありがとう。私はこれをできるだけ早く正しいものとして受け入れます。 – Morilon

関連する問題