在不创建要查询的新表的情况下获取此结果表?

Get this result table without creating a new table to query?

提问人:I'm Signal 提问时间:11/6/2023 最后编辑:Adrian MaxwellI'm Signal 更新时间:11/7/2023 访问量:72

问:

我想看看是否有办法将这两个查询写为一个并避免创建新表。我需要列出关系的 ,以及 Designer 的 EmployeeID、Designer 的 、 Designer 的 、 Technician 的 、 Technician 的 和 Technician 的 。我有一个关系名称,其中包含员工的个人详细信息,以及 和 的关系,交汇点关系和 ,我有一个名为 的关系。作为参考,下面是结果集:SerialNumsModelNumsVacuumFirstNameLastNameEmployeeIDFirstNameLastNameEmployeeDesignerTechnicianDesignInspectionVacuumdesired result set

以下是我当前的查询,我想将其合并为一个,并避免创建表:

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 技巧,谢谢!

sql-server 联接

评论

3赞 jarlh 11/6/2023
对所有列进行限定是一种很好的编程做法,至少在涉及多个表时是这样,尤其是在执行外部联接时。
2赞 jarlh 11/6/2023
在寻求 SQL 帮助时,一个最小的可重现示例是一个很好的开始。请注意,这里的大多数人都希望示例数据预期结果都是格式正确的文本(即没有图像,没有链接)。
3赞 Thorsten Kettner 11/6/2023
这些是许多完整的外部连接。阅读您的第一个查询,存在没有设计的真空,没有真空的设计,没有员工的设计以及没有设计的员工。并且您希望选择所有这些行,但那些与具有序列号的真空无关的行除外。这听起来不太可能。您确定需要完整的外部连接吗?你能展示一下表格的定义吗?
0赞 siggemannen 11/6/2023
你不能把每张桌子都留下来,然后有一个大的选择吗?
1赞 Adrian Maxwell 11/6/2023
提示:“选择不同”会增加工作量,请谨慎使用

答:

0赞 Adrian Maxwell 11/6/2023 #1

这是一种替代方法,但请注意,我并没有故意使用“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 来试验格式化选项。在我的示例中,我“展开逗号列表”并关闭“尾随逗号”。人们使用“尾随逗号”更常见,但我真的不同意这种约定。

评论

1赞 I'm Signal 11/7/2023
非常感谢您的帮助!我对学习 SQL 还很陌生,所以我很欣赏您提供的工具和技巧。