【问题标题】:Match Id from one table with name from another and null values - mimer sql将一个表中的 ID 与另一个表的名称和空值匹配 - mimer sql
【发布时间】:2019-01-06 12:19:22
【问题描述】:

我想从另一个表中引入与当前表中我的 id 匹配的列。

我已经完成了这个查询:

SELECT dept, SUM(quantity) as TotalQuantity 
FROM sale 
GROUP BY dept 
ORDER BY TotalQuantity;

这给了我一个特定“部门”的总销售额,现在我想使用显式连接将部门的名称带入其中,而 WITHOUT 和 WITH 。部门名称在另一个名为“dept”的表中,列为“name”。是否也有可能获取我的“销售”表的空值?

SELECT dept, SUM(quantity) as TotalQuantity 
FROM sale 
GROUP BY dept 
ORDER BY TotalQuantity;

【问题讨论】:

  • 欢迎来到 StackOverflow。请包含数据的 DDL 和一个带有预期结果的简单示例。另外...我已经格式化了两个查询,但显示的是相同的查询,所以,我认为您的第一个版本中有一个错误。

标签: sql mimer-sql


【解决方案1】:

正确的方法是使用显式的JOIN

SELECT d.name, d.dept, SUM(s.quantity) as TotalQuantity 
FROM dept d JOIN
     sale s
     ON d.dept = s.dept
GROUP BY d.name, d.dept 
ORDER BY TotalQuantity;

如果您想要来自dept 的所有行,即使是那些没有销售的行,请使用LEFT JOIN

注意表别名和限定列引用的使用。这些是查询引用多个表时的最佳做法。

我绝不会建议任何人在FROM 子句中使用逗号。这简直是​​糟糕的形式。如果需要,您可以使用子查询:

SELECT (SELECT d.name
        FROM dept
        WHERE d.dept = s.dept
       ) as name
       s.dept, SUM(s.quantity) as TotalQuantity 
FROM sale s
GROUP BY s.dept 
ORDER BY TotalQuantity;

或者,或者:

SELECT d.dept, d.name,
       (SELECT SUM(s.quantity)
        FROM sales s
        WHERE s.dept = d.dept
       ) as TotalQUantity
FROM dept d
ORDER BY TotalQuantity;

这相当于LEFT JOIN 版本——它保留所有部门。使用正确的索引(sales(dept, quantity)),这甚至可以是最快的版本。

【讨论】:

    【解决方案2】:

    我还想将没有售出任何商品的部门以及已售出的商品数量设为 null:

    这是正确的方法吗?

    SELECT s.dept, d.name, SUM(s.quantity) as TotalQuantity 
    FROM sale s, dept d
    WHERE d.number = s.dept AND s.quantity IS NULL
    GROUP BY s.dept, d.name
    ORDER BY TotalQuantity;
    

    【讨论】:

    • 或者这会给我一个单独的结果,我希望空值与另一个结果的结果相同(显示每个部门已售出的商品数量)
    • 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接!
    【解决方案3】:

    使用显式 JOIN(假设列 sale.dept 引用 dept.id):

    SELECT d.id d.name, SUM(s.quantity) AS TotalQuantity 
    FROM dept AS d
    LEFT JOIN sale AS s ON d.id = s.dept
    GROUP BY d.id d.name
    ORDER BY TotalQuantity
    

    因为LEFT JOIN,没有销售的部门也会出现在结果列表中。

    这与使用隐式的旧式 JOIN 执行相同的查询不太相关,但那是:

    SELECT d.id d.name, SUM(s.quantity) AS TotalQuantity 
    FROM sale AS s, dept AS d
    WHERE d.id = s.dept
    GROUP BY d.id d.name,
    ORDER BY TotalQuantity
    

    【讨论】:

    • 非常感谢您的快速回答,但它给了我一些错误:函数 PREPARE d.id 中的 Mimer SQL 错误 -12202 不是插入表、更新表或 FROM 中标识的任何表的列子句
    • @Boohz12 :我说我假设dept 有一个列id,但情况是这样吗?表 dept 中有哪些可用列?
    • 为了确保第一个是显式的,第二个是没有的?
    • 一是显式JOIN,二是隐式JOIN
    • 谢谢 :) 您知道如何使用相同的查询,而且还可以显示尚未售出任何商品的部门,其中已售出的商品数量为 null?
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多