Сопоставить идентификатор из одной таблицы с именем из другого и нулевые значения - mimer sql - PullRequest
0 голосов
/ 06 января 2019

Я хочу получить столбец из другой таблицы, который соответствует моему идентификатору из текущей таблицы.

Я сделал этот запрос:

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 голосов
/ 06 января 2019

Я также хочу представить отделы, которые не продали никаких предметов, также с нулем, как количество проданных предметов:

Это правильный путь?

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;
0 голосов
/ 06 января 2019

Правильный способ - использовать явное 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)) это может быть даже самая быстрая версия.

0 голосов
/ 06 января 2019

Использование явного 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
...