2

次のようなマスター/ディテール型構造を持つ既存のデータ モデルをクエリしようとしています。

Master
-----
MasterId (PK)
Description


Detail
-----
DetailId (PK)
MasterId (FK)
DetailCategoryId (FK)    
Description

各詳細カテゴリのデフォルト値を示す -1 の MasterId を持つ一連の詳細レコードもあります。そのため、指定されたカテゴリのマスターに詳細がない場合は、デフォルト値を取得する必要があります。

いくつかの異なる方法で特定のマスターレコードに対してこれを行うことができましたが、これまでに思いついた解決策では、「指定された」詳細を把握し、不足しているデフォルトのセットと結合する必要があります。 .

私の質問は、すべて/複数のマスターレコードに対してこれを行うにはどうすればよいですか?

(これは、レポート目的で照会している既存のデータ モデルです。マイナーな修正はできるかもしれませんが、完全な再設計の可能性はありません。したがって、問題は、「どのように処理するか」ではなく、「これをどのように処理するか」です。私はこれを再モデル化しますか?')

4

3 に答える 3

1

これでうまくいくと思います。15 を任意のカテゴリに置き換えるだけです。

SELECT
    m.MasterId,ISNULL(d.DetailId,dflt.DetailId)
FROM Master m
LEFT JOIN Detail d ON d.masterid=m.masterid and d.DetailCategoryId=15
LEFT JOIN Detail dflt on dflt.masterid=-1 and d.DetailCategoryId=15
于 2013-02-05T18:38:00.837 に答える
0

これを試して:

WITH CTE AS (
    SELECT M.MasterId, M.Description, D.DetailId
    FROM Master M
      LEFT JOIN Detail D ON M.MasterId = D.MasterId AND D.DetailCategoryId = @CatId
  )
SELECT  MasterId, Description, DetailId
FROM CTE
WHERE DetailId IS NOT NULL
UNION 
SELECT CTE.MasterId, CTE.Description, D.DetailId
FROM CTE 
  JOIN Detail D ON D.MasterId = -1 AND D.DetailCategoryId = @CatId
WHERE CTE.DetailId IS NULL

テスト用のSQL Fiddleは次のとおりです。

幸運を。

于 2013-02-05T18:31:10.600 に答える
0

最初の解決策:

DECLARE @MasterID INT;
SET @MasterID=123;

SELECT  d.DetailID, d.DetailCategoryID, d.Description
FROM    Detail d
WHERE   d.MasterID=@MasterID;

IF @@ROWCOUNT=0 -- If no rows then fetch default rows
BEGIN
    SELECT  d.DetailID, d.DetailCategoryID, d.Description
    FROM    Detail d
    WHERE   d.MasterID=-1;
END;

@@ROWCOUNT

2番目の解決策:

SELECT *
FROM (
    SELECT *, DENSE_RANK() OVER(ORDER BY x.MasterID DESC) AS Rnk
    FROM (
        SELECT  d.MasterID, d.DetailID, d.DetailCategoryID, d.Description
        FROM    Detail d
        WHERE   d.MasterID=@MasterID
        UNION ALL
        SELECT  d.MasterID, d.DetailID, d.DetailCategoryID, d.Description
        FROM    Detail d
        WHERE   d.MasterID=-1
    ) x
) y
WHERE y.MasterID=-1 AND y.Rnk=1
OR y.MasterID>0;

注: この最後の解決策では、MasterIDデフォルト以外のすべての値が 0 より大きい ( MasterID>0) と想定しています。

于 2013-02-05T19:20:07.057 に答える