【发布时间】:2016-11-25 22:53:54
【问题描述】:
在将以下 2 个查询转换为 ANSI 兼容代码时需要帮助。我的代码使用 =* 运算符,我需要将它们转换为右外连接。我已经给了它一个很好的尝试,但是,无法获得预期的结果。
查询 1
SELECT m.MatterID, m.MatterType,
m.HasSuppressionOrder, m.Complexity,
m.DateReceived, m.DateCompleted,
ph.OfficerID, pe.Surname + ', ' + pe.GivenNames, h1.Result
FROM CMS.MATTER m,
CMS.PHASE ph,
CMS.PERSON pe,
CMS.HEARING h1
WHERE
(m.DateCompleted BETWEEN '2015-10-29 00:00:00' and '2015-10-30 00:00:00')
AND (ph.MatterID = m.MatterID
and ph.PhaseSeq = (SELECT MAX(ph2.PhaseSeq) FROM CMS.PHASE ph2 where ph2.MatterID = m.MatterID))
AND (pe.PersonNo = (SELECT mp.PersonNo FROM CMS.MATTER_PERSON mp
WHERE mp.MatterID = m.MatterID and mp.MatterPersonType = 'DEF'))
AND (h1.MatterID =* m.MatterID and --NON ANSI JOIN OPERATORS THAT NEED CONVERSION
h1.PhaseSeq =* ph.PhaseSeq and --NON ANSI JOIN OPERATORS THAT NEED CONVERSION
h1.HearingDateTime =* (SELECT MAX(h2.HearingDateTime)FROM CMS.HEARING h2 WHERE h2.MatterID = m.MatterID))
ORDER BY m.MatterID
查询 2
SELECT m.MatterID,
m.MatterType,
m.HasSuppressionOrder,
m.DateReceived,
ISNULL (ph.OfficerID, 'No Phase'),
ISNULL (pe.Surname, 'No Accused Registered') + ', ' + pe.GivenNames,
m.Complexity,
m.ProgramCode,
m.Comments,
m.StaffGroup,
m.StaffSubGroup
FROM CMS.MATTER m,
CMS.PHASE ph,
CMS.PERSON pe
WHERE m.DateReceived BETWEEN '2015-09-30 00:00:00' AND '2015-10-30 00:00:00'
AND ph.MatterID =* m.MatterID -- Taken care
AND ph.PhaseSeq =* (
SELECT MAX( PhaseSeq )
FROM CMS.PHASE
WHERE MatterID = m.MatterID -- Taken care
)
AND pe.PersonNo =* (
SELECT PersonNo
FROM CMS.MATTER_PERSON
WHERE MatterID = m.MatterID
AND MatterPersonType = 'DEF'
)
我尝试转换查询 2 并编写以下内容:
SELECT m.MatterID,
m.MatterType,
m.HasSuppressionOrder,
m.DateReceived,
ISNULL (ph.OfficerID, 'No Phase'),
ISNULL (pe.Surname, 'No Accused Registered') + ', ' + pe.GivenNames,
m.Complexity,
m.ProgramCode,
m.Comments,
m.StaffGroup,
m.StaffSubGroup
FROM CMS.PHASE ph
right join CMS.MATTER m ON ph.MatterID = m.MatterID
RIGHT JOIN CMS.PERSON pe ON ((SELECT PersonNo FROM CMS.MATTER_PERSON WHERE MatterID = m.MatterID AND MatterPersonType = 'DEF')= pe.PersonNo)
RIGHT JOIN CMS.PHASE ph2 ON ((SELECT MAX(PhaseSeq) FROM CMS.PHASE ph WHERE ph.MatterID = m.MatterID)=ph2.PhaseSeq)
WHERE (m.DateReceived BETWEEN '2015-09-30 00:00:00' AND '2015-10-30 00:00:00')
=============================================
但是,有些不对劲。
【问题讨论】:
-
您期待什么?什么不正确 - “语法不正确”或“数据不符合预期”?
-
重写的 ON 条件下的那些子选择是......可疑的。我不确定我什至了解这些条件应该做什么。通常,连接条件识别一个表中的一列和另一个表中的一列,并以某种方式测试它们的关系。
标签: sql tsql outer-join