提问人:I'm Signal 提问时间:11/6/2023 最后编辑:Adrian MaxwellI'm Signal 更新时间:11/7/2023 访问量:72
在不创建要查询的新表的情况下获取此结果表?
Get this result table without creating a new table to query?
问:
我想看看是否有办法将这两个查询写为一个并避免创建新表。我需要列出关系的 ,以及 Designer 的 EmployeeID、Designer 的 、 Designer 的 、 Technician 的 、 Technician 的 和 Technician 的 。我有一个关系名称,其中包含员工的个人详细信息,以及 和 的关系,交汇点关系和 ,我有一个名为 的关系。作为参考,下面是结果集:SerialNums
ModelNums
Vacuum
FirstName
LastName
EmployeeID
FirstName
LastName
Employee
Designer
Technician
Design
Inspection
Vacuum
以下是我当前的查询,我想将其合并为一个,并避免创建表:
SELECT DISTINCT SerialNum, ModelNum_FK AS ModelNum, Design.EmployeeID_FK AS DesignerEmpID, FirstName AS DesignerFirstName, LastName AS DesignerLastName
INTO VacuumDesigner
FROM Vacuum
FULL OUTER JOIN Design
ON SerialNum = Design.SerialNum_FK
FULL OUTER JOIN Employee
ON EmployeeID = Design.EmployeeID_FK
WHERE SerialNum IS NOT NULL;
SELECT SerialNum, ModelNum, DesignerEmpID, DesignerFirstName, DesignerLastName, EmployeeID AS TechEmpID, FirstName AS TechFirstName, LastName AS TechLastName FROM VacuumDesigner
FULL OUTER JOIN Inspection
ON SerialNum = SerialNum_FK
FULL OUTER JOIN Employee
ON EmployeeID = Inspection.EmployeeID_FK
WHERE SerialNum IS NOT NULL;
DROP TABLE VacuumDesigner;
非常感谢有关格式化此/这些查询的任何和所有 SQL 技巧,谢谢!
答:
这是一种替代方法,但请注意,我并没有故意使用“select distinct”。“选择非重复”会增加查询工作量,并且可能会浪费大量时间,因此在添加它之前,请检查原始结果以查看是否真的需要它。
另请注意,每个“完全外部联接”也会增加查询工作量,并且此联接类型通常试图弥补缺失的数据和/或较差的数据质量。由于您的表包含“外键”,这表明您的数据应该具有良好/合理的数据质量 - 因此,除非您绝对知道需要它们,否则不要使用“完整的外部连接”。取而代之的是,从“左连接”开始,即使没有设计人员或检查员,也可以列出来自真空吸尘器的数据。如果没有设计器,则设计器列将为 null,同样,如果没有检查器,则这些列将为 null。
SELECT
v.SerialNum
, v.ModelNum_FK AS ModelNum
, Design.EmployeeID_FK AS DesignerEmpID
, FirstName AS DesignerFirstName
, LastName AS DesignerLastName
, ie.EmployeeID AS TechEmpID
, ie.FirstName AS TechFirstName
, ie.LastName AS TechLastName
FROM Vacuum v
LEFT JOIN Design d ON v.SerialNum = d.SerialNum_FK
LEFT JOIN Employee e ON d.EmployeeID_FK = e.EmployeeID
LEFT JOIN Inspection i ON v.SerialNum = i.SerialNum_FK
LEFT JOIN Employee ie ON i.EmployeeID_FK = ie.EmployeeID
WHERE v.SerialNum IS NOT NULL
现在,如果每个真空吸尘器至少有 1 名设计师,您可以使用“内部连接”来设计人员和(第一个实例)员工。同样,如果每个真空吸尘器至少有 1 名检查员,则可以使用“内部连接”作为检查表和(第二个)员工。
铌如果序列号有 1 个以上的设计人员和/或多个检查员,则可以预期查询会为每个序列号生成多行。“select distinct”不会将此类结果减少到每个序列 1 行,因为“select distinct”将整行考虑在一起,它只会丢弃整行与其他行完全相同的行。
例如,这些不会被“select distinct”删除,因为每行至少有 1 个部分是不同的:
123, designer x, inspector y
123, designer x, inspector z
关于查询的“格式化”,这要么在您的网站上按照惯例确定,要么根据个人偏好确定。正如你在上面看到的,我更喜欢“逗号优先”的列表方法。你可以使用 PoorSQL 来试验格式化选项。在我的示例中,我“展开逗号列表”并关闭“尾随逗号”。人们使用“尾随逗号”更常见,但我真的不同意这种约定。
评论