T-SQL 声明子查询返回多个值但数据是唯一的

问题描述 投票:0回答:1

第一个问题。我使用的是SQL Server 2012,在其他地方找不到类似的问题,而且我还在学习SQL。 我正在尝试让子查询返回一个值。当您比较 JobPaperID AND 里程碑时,我的表 (JobMilestones) 是唯一的。任何独立查询将仅返回一个值或不返回任何值。它给出了错误 -

子查询返回超过 1 个值。当子查询跟在 =、!=、<, <= , >、>= 后面或子查询用作表达式时,这是不允许的

当我不添加子查询时,查询的其余部分会给出正确的结果,但我也确实需要子查询。在 JobMilestones 表中,我要么有一个特定作业的条目,该条目具有唯一的 JobPaperID 和唯一的里程碑(一起),要么没有条目(我怀疑后者是问题所在)。我希望子查询返回 CompletedDate 或在记录不存在时返回单个 NULL 值。我希望它返回一个 NULL(没有记录)或 CompletedDate 的值。我哪里错了?

这是我正在使用的代码:

SELECT 
    mjd.ID as JobID,
    mjd.JobNo as JobNo, 
    mjd.CreateDateTime as JobCreatedDateTime, 
    mjd.InvoiceCustomerCode as CustomerCode, 
    mjd.MilestoneGroup as MilestoneGroup, 
    mg.Name as MilestoneGroupDescr, 
    ml.MilestoneID as MilestoneID, 
    case m.CustomType
        when 0 then m.Type
        else m.CustomType
    end AS MilestoneReal, 
    m.Name as MilestoneName,
    jp.ID as JobPaperID, 
    jp.Name as JobPaperName,
    (select jms.CompletedDate
        from dbo.JobMilestones AS jms
        where ((jms.JobPaperID = jp.ID) 
            AND (jms.Milestone = MilestoneReal))
    ) AS CompletedDate
FROM dbo.MainJobDetails AS mjd
INNER JOIN dbo.MilestoneGroup AS mg
    ON mjd.MilestoneGroup = mg.Code
INNER JOIN dbo.JobPaper AS jp 
    ON mjd.ID = jp.JobID
INNER JOIN dbo.MilestoneLink AS ml 
    ON mg.ID = ml.MilestoneGroupID
INNER JOIN dbo.Milestones AS m 
    ON ml.MilestoneID = m.ID
WHERE mjd.ID = 87101 

如果我将其更改为 SELECT TOP 1,我得到的所有内容都是 NULL,并且没有有效条目

sql-server t-sql
1个回答
0
投票

感谢@Martin Smith,解决方案看起来很简单:

SELECT 
    mjd.ID as JobID,
    mjd.JobNo as JobNo, 
    mjd.CreateDateTime as JobCreatedDateTime, 
    mjd.InvoiceCustomerCode as CustomerCode, 
    mjd.MilestoneGroup as MilestoneGroup, 
    mg.Name as MilestoneGroupDescr, 
    ml.MilestoneID as MilestoneID, 
    case m.CustomType
        when 0 then m.Type
        else m.CustomType
    end AS MilestoneReal, 
    m.Name as MilestoneName,
    jp.ID as JobPaperID, 
    jp.Name as JobPaperName,
    (select jms.CompletedDate
        from dbo.JobMilestones AS jms
        where ((jms.JobPaperID = jp.ID) 
            AND (jms.Milestone = 
                    case m.CustomType
                        when 0 then m.Type
                        else m.CustomType
                    end))
    ) AS CompletedDate
FROM dbo.MainJobDetails AS mjd
INNER JOIN dbo.MilestoneGroup AS mg
    ON mjd.MilestoneGroup = mg.Code
INNER JOIN dbo.JobPaper AS jp 
    ON mjd.ID = jp.JobID
INNER JOIN dbo.MilestoneLink AS ml 
    ON mg.ID = ml.MilestoneGroupID
INNER JOIN dbo.Milestones AS m 
    ON ml.MilestoneID = m.ID
WHERE mjd.ID = 87101

唉!我无法在子查询中使用别名。

© www.soinside.com 2019 - 2024. All rights reserved.