3

こんばんは、

下の画像のようなテーブルレイアウトがあります。Userテーブルには、ほとんどの情報が格納されています。ユーザーごとに、未定の数のプリファレンス場所の選択を行うこともできます。これらは、画像に示すようにジャンクション テーブルに格納されます。

データ テーブルのレイアウト

  1. 管理者がレポートを作成する場合、設定と場所の選択をフィルターのように使用します。たとえば、Preference1 と Preference3、および UserLocation2 と UserLocation4 を選択すると、レポートには、少なくとも 1 つの設定と少なくとも 1 つの場所を持つユーザーのみが表示されます。1 つの SQL 選択ステートメントでこれを行うことは可能ですか? SQL Server 2008 R2 を使用しています。

  2. ユーザー レコードが上記に従って返される資格があると仮定すると、すべての設定と場所を新しい列に連結して表示する方法はありますか。個々のユーザーに対して連結された結果を取得する方法を理解しましたが、同じ SQL 選択ステートメントの一部としても実行できるかどうか疑問に思います。

これは、個々の UserID について、コンマ区切りの設定を返すために私が持っているものです...

DECLARE @concatlist VARCHAR(MAX)
SELECT @concatlist = COALESCE(@concatlist+', ', '') + dbo.Preference.Title
FROM dbo.UserPreference
LEFT OUTER JOIN dbo.Preference 
ON dbo.UserPreference.PreferenceID = dbo.Preference.PreferenceID
WHERE dbo.UserPreference.UserID = 5
SELECT @concatlist as OutputColumn

どんな指針も素晴らしいでしょう。私はこれに半日を費やしましたが、部分的にはできますが、1 つのステートメントでそれを行う方法を見つけることができません。

ありがとう、

4

2 に答える 2

2

あなたはこれを試すことができます

WITH UPreference AS (
    SELECT  u.*,p.*
    FROM    Users u
    INNER JOIN UserPreference up
      ON u.UserID = up.UserID
    INNER JOIN Preference p
      ON up.PreferenceID = p.PreferenceID
) 
, ULocation AS   (
    SELECT  u.*,l.*
    FROM    Users u
    INNER JOIN UserLocation ul
      ON u.UserID = ul.UserID
    INNER JOIN Location l
      ON l.LocationID = ul.LocationID
)
SELECT  u.*
    ,AllPreferences = STUFF((SELECT ',' + up.Title FROM UPreference up WHERE up.UserID = u.UserID FOR XML PATH('')) ,1,1,'')
    ,AllLocations = STUFF((SELECT ',' + ul.[Name] FROM ULocation ul WHERE ul.UserID = u.UserID FOR XML PATH('')) ,1,1,'')
FROM    Users u 
WHERE 
  EXISTS(SELECT 1 FROM UPreference up WHERE up.UserID = u.UserID AND up.Title IN ('Preference1','Preference3')
AND 
  EXISTS(SELECT 1 FROM ULocation ul WHERE ul.UserID = u.UserID AND ul.[Name] IN ('Location2','Location4')
于 2013-10-28T19:27:38.820 に答える