Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ';主详图';键入query,默认值为';细节';价值观_Sql_Sql Server_Tsql - Fatal编程技术网

Sql ';主详图';键入query,默认值为';细节';价值观

Sql ';主详图';键入query,默认值为';细节';价值观,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图查询一个具有主细节类型结构的预先存在的数据模型,如下所示: Master ----- MasterId (PK) Description Detail ----- DetailId (PK) MasterId (FK) DetailCategoryId (FK) Description 还有一系列MasterId为-1的详细信息记录,指示每个详细信息类别的默认值。因此,如果指定类别的主控形状没有详细信息,则应检索默认值 我已经通过几种不同的方式为给定的主记录做到了这一点,但到

我试图查询一个具有主细节类型结构的预先存在的数据模型,如下所示:

Master
-----
MasterId (PK)
Description


Detail
-----
DetailId (PK)
MasterId (FK)
DetailCategoryId (FK)    
Description
还有一系列MasterId为-1的详细信息记录,指示每个详细信息类别的默认值。因此,如果指定类别的主控形状没有详细信息,则应检索默认值

我已经通过几种不同的方式为给定的主记录做到了这一点,但到目前为止,我提出的解决方案通常要求我计算“指定”的细节,然后结合一组缺少的默认值

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

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

尝试以下方法:

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
这是测试的方法


祝你好运。

我想这会奏效的。你只需要用任何类别来替换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

第一个解决方案:

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;
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;

第二种解决方案:

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;
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
)。

非常确定这将为您提供两个RecordsSited--请参见上面的解决方案Widdle。祝你好运。我认为这行不通。看看这两种解决方案:--这就是我在意识到它不能正常工作之前的开始方式。@sgedes如果OP将别名设置为右-秒
left join
应该读为
left join Detail dflt on dflt.masterid=-1和dflt.DetailCategoryId=15
,因为如果在
d
中找不到记录,那么
d.DetailCategoryId
将为空,不能与
默认详细信息行匹配@尼古拉·马尔科维诺维奇——是的,我明白你的意思。还需要添加不同的:@sgedes我不这么认为。每个DetailCategoryId应该只有一条
默认记录。否则OP将需要额外的指示符才能隔离
默认值
记录。@NikolaMarkovinović——不用担心,我只是假设每个主ID的详细表可以有多行。。。每操作“MasterId为-1,表示每个细节类别的默认值”-默认值-如我所说,没什么大不了的-此解决方案运行良好。祝你好运。