SQL подзапрос с GROUP BY, который возвращает дубликаты минимумов. как это интерпретируется внешним запросом? - PullRequest
0 голосов
/ 07 января 2020

Я работал над некоторыми вопросами подзапроса, и в качестве ответа был приведен код ниже.

мой вопрос: если внутренний запрос возвращает две одинаковые минимальные зарплаты, которые принадлежат разным отделам. как внешний запрос будет интерпретировать это? Признает ли он, что зарплаты относятся к разным отделам?

SELECT first_name, last_name, salary, department_id 
FROM employees 
WHERE salary IN ( SELECT MIN(salary) 
FROM employees 
GROUP BY department_id );

спасибо

Ответы [ 4 ]

0 голосов
/ 07 января 2020

Вы можете передать дополнительную информацию / условие, подобное этому, для отдела.

CREATE TABLE employees (
    empname VARCHAR(20)
    ,salary DECIMAL(18, 2)
    ,department_id INT
    )

INSERT INTO employees
VALUES ('A', 100,1), ('B', 100, 2), ('C', 300, 2)

SELECT *
FROM employees
WHERE salary IN (
        SELECT MIN(salary)
        FROM employees
        GROUP BY department_id
        HAVING department_id = 2
        )
    AND department_id = 2;

Вот вывод

empname salary  department_id
-----------------------------
B       100.00  2

Хотя 100.00 - минимальная зарплата для обоих A и B, но вы передали информацию для идентификатора отдела: 2. Таким образом, только B пришел на выходе.

0 голосов
/ 07 января 2020

Поскольку заявление в настоящее время написано, оно будет показывать вам каждую запись из таблицы сотрудников, которая соответствует минимальной зарплате для каждого отдела и самой зарплате. Таким образом, внешний запрос ничего не знает о кафедре_идентификаторе, что означает отсутствие корреляции между этим атрибутом из внутреннего запроса и внешним запросом. Для этого вам нужно изменить свою логику c, например, на JOIN.

0 голосов
/ 07 января 2020

Вы можете использовать rank():

select e.*
from (select e.*, rank() over (partition by e.department_id order by e.salary) as seq
      from employees e
     ) e
where e.seq = 1;  
0 голосов
/ 07 января 2020

Нет, он ничего не знает об информации отдела. Вам нужно изменить IN на JOIN:

SELECT e.first_name, e.last_name, e.salary, e.department_id 
FROM employees e
INNER JOIN ( SELECT department_id,IN(salary)  AS salary
FROM employees 
GROUP BY department_id) s
ON s.department_id=e.department_id
AND s.salary=e.salary;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...