在 SQL 查询中包含可能的空白行
Including Possibly Blank Rows in SQL Query
我想从 SQL 查询创建一系列行,其中在某些情况下 table 中可能不存在其中一个排序参数。这是我目前所拥有的:
SELECT h.DocumentNumber,
e0.ID as ID, e0.LastName+', '+e0.FirstName AS Employee,
e0.VpgFunction AS 'VPG Function',
e0.VpgPosition AS 'VPG Title',
e0.Grade AS Grade,
h.Period AS Period,
e0.Region AS Region,
e0.Country AS Country,
e0.Location AS Location,
e0.Division AS Division,
e0.Subdivision AS Subdivision,
e1.LastName+', '+e1.FirstName AS 'First Evaluator',
e2.LastName+', '+e2.FirstName AS 'Second Evaluator',
e3.LastName+', '+e3.FirstName AS 'Third Evaluator',
h1.Data AS 'Overall Performance Evaluation',
h.State AS State
FROM EefHeader h INNER JOIN Employees e0 ON h.Employee =
e0.Username INNER JOIN Employees e1 ON h.FirstEvaluator =
e1.Username LEFT JOIN Employees e2 ON h.SecondEvaluator =
e2.Username LEFT JOIN Employees e3 ON h.ThirdEvaluator =
e3.Username LEFT JOIN EefHistory h1 ON h.DocumentNumber =
h1.DocumentNumber WHERE h1.DataElementId = 'ManagerOverallEvaluationRbl'
ORDER BY h.DocumentNumber;
事情是这样的。对于 h1 (EefHistory) 中的给定 DocumentNumber,可能根本没有 DataElementId 等于 'ManagerrOverallEvaluationRbl' 的行。在这种情况下,我仍然希望 return 将 'Overall Performance Evaluation' 留空或 NULL 之类的那一行。是否可以在查询中执行此操作? (我之所以问,是因为查询结果稍后会数据绑定到 table。此外,可能会有也可能不会有第二个和第三个求值器,这就是我在那里使用 LEFT JOIN 的原因。)
你有两个选择。
- 在 where 子句中包含一个
or
来处理空值
- 遵循更标准化的方法并将限制移至 on 子句。
将其移动到 on 子句会强制引擎在连接之前执行限制(作为过滤器应用)。这反过来又允许左连接按需要运行。当你说在or上包含null时,你并不知道这个NULL是join的结果,还是dataElementID本身的值是null;这就是为什么最好在 ON 子句上应用限制。
WHERE (h1.DataElementId = 'ManagerOverallEvaluationRbl' OR h1.dataElementID is null)
或
SELECT h.DocumentNumber,
e0.ID as ID, e0.LastName+', '+e0.FirstName AS Employee,
e0.VpgFunction AS 'VPG Function',
e0.VpgPosition AS 'VPG Title',
e0.Grade AS Grade,
h.Period AS Period,
e0.Region AS Region,
e0.Country AS Country,
e0.Location AS Location,
e0.Division AS Division,
e0.Subdivision AS Subdivision,
e1.LastName+', '+e1.FirstName AS 'First Evaluator',
e2.LastName+', '+e2.FirstName AS 'Second Evaluator',
e3.LastName+', '+e3.FirstName AS 'Third Evaluator',
h1.Data AS 'Overall Performance Evaluation',
h.State AS State
FROM EefHeader h INNER JOIN Employees e0 ON h.Employee =
e0.Username INNER JOIN Employees e1 ON h.FirstEvaluator =
e1.Username LEFT JOIN Employees e2 ON h.SecondEvaluator =
e2.Username LEFT JOIN Employees e3 ON h.ThirdEvaluator =
e3.Username LEFT JOIN EefHistory h1 ON h.DocumentNumber = h1.DocumentNumber and
h1.DataElementId = 'ManagerOverallEvaluationRbl'
ORDER BY h.DocumentNumber;
要处理评论中的附加要求,只需生成一个数据集,其中包含每个文档的最大修订号并加入该集。根据期望的结果,我们可能必须更改现有的左连接,以将 h1 和 h2 之间的连接作为一个整体子选择进行。不确定 dataElementID 是否适用于两个联接或仅适用于基于
的联接
这是一种方法:只需将其添加为另一个左连接....
LEFT JOIN (Select max(h1.revsionNumber), documentNumber
from EefHistory group by documentNumber) h2
on h2.documentNumber = h1.documentNumber
and h2.RevisionNumber = h1.RevisionNumber
或者可能是这个。
SELECT h.DocumentNumber,
e0.ID as ID, e0.LastName+', '+e0.FirstName AS Employee,
e0.VpgFunction AS 'VPG Function',
e0.VpgPosition AS 'VPG Title',
e0.Grade AS Grade,
h.Period AS Period,
e0.Region AS Region,
e0.Country AS Country,
e0.Location AS Location,
e0.Division AS Division,
e0.Subdivision AS Subdivision,
e1.LastName+', '+e1.FirstName AS 'First Evaluator',
e2.LastName+', '+e2.FirstName AS 'Second Evaluator',
e3.LastName+', '+e3.FirstName AS 'Third Evaluator',
h1.Data AS 'Overall Performance Evaluation',
h.State AS State
FROM EefHeader h
INNER JOIN Employees e0
ON h.Employee = e0.Username
INNER JOIN Employees e1
ON h.FirstEvaluator = e1.Username
LEFT JOIN Employees e2
ON h.SecondEvaluator = e2.Username
LEFT JOIN Employees e3
ON h.ThirdEvaluator = e3.Username
LEFT JOIN (Select * from EefHistory h1
INNER JOIN (SELECT max(revsionNumber) mrn, documentNumber
FROM EefHistory GROUP BY documentNumber) h2
on h2.documentNumber = h1.documentNumber
and h2.mrn = h1.RevisionNumber
and h1.DataElementId = 'ManagerOverallEvaluationRbl'
ON h.DocumentNumber = z.DocumentNumber
ORDER BY h.DocumentNumber;
此处的目的是获取一组 eefHistory,其中包含所有列,但仅包含 dataElementID 为 'ManagerOverallEvaluationRbl'
的最大文档和修订号
我想从 SQL 查询创建一系列行,其中在某些情况下 table 中可能不存在其中一个排序参数。这是我目前所拥有的:
SELECT h.DocumentNumber,
e0.ID as ID, e0.LastName+', '+e0.FirstName AS Employee,
e0.VpgFunction AS 'VPG Function',
e0.VpgPosition AS 'VPG Title',
e0.Grade AS Grade,
h.Period AS Period,
e0.Region AS Region,
e0.Country AS Country,
e0.Location AS Location,
e0.Division AS Division,
e0.Subdivision AS Subdivision,
e1.LastName+', '+e1.FirstName AS 'First Evaluator',
e2.LastName+', '+e2.FirstName AS 'Second Evaluator',
e3.LastName+', '+e3.FirstName AS 'Third Evaluator',
h1.Data AS 'Overall Performance Evaluation',
h.State AS State
FROM EefHeader h INNER JOIN Employees e0 ON h.Employee =
e0.Username INNER JOIN Employees e1 ON h.FirstEvaluator =
e1.Username LEFT JOIN Employees e2 ON h.SecondEvaluator =
e2.Username LEFT JOIN Employees e3 ON h.ThirdEvaluator =
e3.Username LEFT JOIN EefHistory h1 ON h.DocumentNumber =
h1.DocumentNumber WHERE h1.DataElementId = 'ManagerOverallEvaluationRbl'
ORDER BY h.DocumentNumber;
事情是这样的。对于 h1 (EefHistory) 中的给定 DocumentNumber,可能根本没有 DataElementId 等于 'ManagerrOverallEvaluationRbl' 的行。在这种情况下,我仍然希望 return 将 'Overall Performance Evaluation' 留空或 NULL 之类的那一行。是否可以在查询中执行此操作? (我之所以问,是因为查询结果稍后会数据绑定到 table。此外,可能会有也可能不会有第二个和第三个求值器,这就是我在那里使用 LEFT JOIN 的原因。)
你有两个选择。
- 在 where 子句中包含一个
or
来处理空值 - 遵循更标准化的方法并将限制移至 on 子句。
将其移动到 on 子句会强制引擎在连接之前执行限制(作为过滤器应用)。这反过来又允许左连接按需要运行。当你说在or上包含null时,你并不知道这个NULL是join的结果,还是dataElementID本身的值是null;这就是为什么最好在 ON 子句上应用限制。
WHERE (h1.DataElementId = 'ManagerOverallEvaluationRbl' OR h1.dataElementID is null)
或
SELECT h.DocumentNumber,
e0.ID as ID, e0.LastName+', '+e0.FirstName AS Employee,
e0.VpgFunction AS 'VPG Function',
e0.VpgPosition AS 'VPG Title',
e0.Grade AS Grade,
h.Period AS Period,
e0.Region AS Region,
e0.Country AS Country,
e0.Location AS Location,
e0.Division AS Division,
e0.Subdivision AS Subdivision,
e1.LastName+', '+e1.FirstName AS 'First Evaluator',
e2.LastName+', '+e2.FirstName AS 'Second Evaluator',
e3.LastName+', '+e3.FirstName AS 'Third Evaluator',
h1.Data AS 'Overall Performance Evaluation',
h.State AS State
FROM EefHeader h INNER JOIN Employees e0 ON h.Employee =
e0.Username INNER JOIN Employees e1 ON h.FirstEvaluator =
e1.Username LEFT JOIN Employees e2 ON h.SecondEvaluator =
e2.Username LEFT JOIN Employees e3 ON h.ThirdEvaluator =
e3.Username LEFT JOIN EefHistory h1 ON h.DocumentNumber = h1.DocumentNumber and
h1.DataElementId = 'ManagerOverallEvaluationRbl'
ORDER BY h.DocumentNumber;
要处理评论中的附加要求,只需生成一个数据集,其中包含每个文档的最大修订号并加入该集。根据期望的结果,我们可能必须更改现有的左连接,以将 h1 和 h2 之间的连接作为一个整体子选择进行。不确定 dataElementID 是否适用于两个联接或仅适用于基于
的联接这是一种方法:只需将其添加为另一个左连接....
LEFT JOIN (Select max(h1.revsionNumber), documentNumber
from EefHistory group by documentNumber) h2
on h2.documentNumber = h1.documentNumber
and h2.RevisionNumber = h1.RevisionNumber
或者可能是这个。
SELECT h.DocumentNumber,
e0.ID as ID, e0.LastName+', '+e0.FirstName AS Employee,
e0.VpgFunction AS 'VPG Function',
e0.VpgPosition AS 'VPG Title',
e0.Grade AS Grade,
h.Period AS Period,
e0.Region AS Region,
e0.Country AS Country,
e0.Location AS Location,
e0.Division AS Division,
e0.Subdivision AS Subdivision,
e1.LastName+', '+e1.FirstName AS 'First Evaluator',
e2.LastName+', '+e2.FirstName AS 'Second Evaluator',
e3.LastName+', '+e3.FirstName AS 'Third Evaluator',
h1.Data AS 'Overall Performance Evaluation',
h.State AS State
FROM EefHeader h
INNER JOIN Employees e0
ON h.Employee = e0.Username
INNER JOIN Employees e1
ON h.FirstEvaluator = e1.Username
LEFT JOIN Employees e2
ON h.SecondEvaluator = e2.Username
LEFT JOIN Employees e3
ON h.ThirdEvaluator = e3.Username
LEFT JOIN (Select * from EefHistory h1
INNER JOIN (SELECT max(revsionNumber) mrn, documentNumber
FROM EefHistory GROUP BY documentNumber) h2
on h2.documentNumber = h1.documentNumber
and h2.mrn = h1.RevisionNumber
and h1.DataElementId = 'ManagerOverallEvaluationRbl'
ON h.DocumentNumber = z.DocumentNumber
ORDER BY h.DocumentNumber;
此处的目的是获取一组 eefHistory,其中包含所有列,但仅包含 dataElementID 为 'ManagerOverallEvaluationRbl'
的最大文档和修订号