2

我正在尝试使用主从类型结构查询预先存在的数据模型,如下所示:

Master
-----
MasterId (PK)
Description


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

还有一系列 MasterId 为 -1 的详细信息记录,表示每个详细信息类别的默认值。因此,如果对于指定的类别,Master 没有详细信息,则应检索默认值。

我已经设法以几种不同的方式为给定的主记录做到这一点,但到目前为止我提出的解决方案通常需要我,找出“指定”的细节,然后与一组缺失的默认值结合.

我的问题是如何为所有/多个主记录执行此操作?

(这是我为报告目的而查询的现有数据模型。我可能能够进行微小的修改,但没有机会进行全面重新设计,因此问题实际上是“我该如何处理?”而不是“如何做我重新建模这个?')

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

第一个解决方案:

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

第二种解决方案:

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 回答
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 回答