第一个问题。我使用的是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,并且没有有效条目
感谢@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
唉!我无法在子查询中使用别名。