#mysql #sql
#mysql #sql
Вопрос:
У меня есть две таблицы: одна — сотрудники, а другая — детали. Здесь мне нужен запрос для отображения сотрудников, у которых несколько телефонных номеров.
Таблица сотрудников:
employee_id Name salary
----------- ------- --------------------
0001 John 100000
0002 Peter 50000
0003 Russel 60000
0004 Bill 60000
0005 Patrick 90000
Подробная таблица :
employee_id Address phone
----------- ------- --------------------
0001 USA 854646542
0002 Germany 656562354
0001 USA 465222333
0004 China 888444444
0005 Canada 012445869
0005 Canada 789875877
0003 Japan 444555807
Исходя из этого, мне нужно отобразить сотрудников, у которых более одного телефонного номера, поэтому ожидаемый результат должен быть
employee_id Name phone
----------- ------- --------------------
0001 John 854646542
0001 John 465222333
0005 Patrick 012445869
0005 Patrick 789875877
Запрос, который я пробовал :
SELECT COUNT(*)
FROM (
SELECT employee_id, COUNT(*) AS CNT
FROM details
GROUP BY employee_id
) AS T
WHERE CNT > 1
Комментарии:
1. Также обратите внимание, что нет смысла в обоих
details
иemployees
иметьName
. Чтобы получить имя, используйте aJOIN
.2. обновил мой вопрос @Akina
Ответ №1:
SELECT DISTINCT employee_id, t3.Name, t1.phone
FROM Details t1
JOIN Details t2 USING (employee_id)
JOIN Employee t3 USING (employee_id)
WHERE t1.phone != t2.phone
-- ORDER BY employee_id
Комментарии:
1. @Vicky Обновлено в соответствии с выпуском вопроса.
Ответ №2:
При этом используется подзапрос
SELECT employee_id, Name, phone
FROM details
WHERE employee_id IN (
SELECT employee_id
FROM details
GROUP BY employee_id
HAVING COUNT(*) > 1
)
Я также могу быть написан с использованием объединения:
SELECT d.employee_id, d.Name, d.phone
FROM
details d
INNER JOIN (
SELECT employee_id
FROM details
GROUP BY employee_id
HAVING COUNT(*) > 1
) p ON d.employee_id = p.employee_id
Это также можно сделать с помощью предложения OVER
SELECT employee_id, Name, phone
FROM (
SELECT
employee_id, Name, phone,
COUNT(*) OVER (PARTITION BY employee_id) AS phone_count
FROM details
) t
WHERE t.phone_count > 1
Комментарии:
1. Привет, пожалуйста, проверьте мой отредактированный вопрос. Как отобразить имя, если оно недоступно в таблице detailis, но доступно в таблице employees?
2. При использовании объединения вам действительно не нужна никакая агрегация здесь
3. @Пожалуйста, затем замените детали на детали объединения сотрудников
Ответ №3:
SELECT employee_id, t1.Name, phone
FROM details
JOIN employees t1 USING (employee_id)
WHERE employee_id IN (
SELECT employee_id
FROM details
GROUP BY employee_id
HAVING COUNT(*) > 1
)
Это будет получено с именем из 1-й таблицы