将一个表中的ID与另一个表中的名称进行匹配,并使用空值-Mimer SQL

时间:2019-01-06 12:19:22

标签: sql mimer-sql

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

我已经完成了以下查询:

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

这给了我特定“部门”售出的物品的总数,现在我想使用显式联接将部门的名称带到那里,而没有和带。部门名称位于另一个名为“ dept”的表中,该表的列为“ name”。还可以获取“销售”表的空值吗?

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

3 个答案:

答案 0 :(得分: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)上,它甚至可以是最快的版本。

答案 1 :(得分:0)

使用显式data:image/png;base64,iVBORw0KGgoAA...(假设列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 ,没有销售的部门也将出现在结果列表中。

这与使用隐式,旧式JOIN进行相同的查询并不太相关,但是应该是:

LEFT JOIN

答案 2 :(得分:0)

我还想展示未售出任何商品的部门,并将售出的商品数设为零:

这是正确的方法吗?

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;