Код ошибки: 1054. Неизвестный столбец "dept" в "списке полей" 0,000 сек.

Я уже прошел: Код ошибки: 1248. Каждая производная таблица должна иметь свой собственный псевдоним. Не найдено решение для запроса, но все еще не уверены, какое правильное имя столбца его ожидает?

Дело 1:

SELECT max(avg_sal), min(avg_sal) 
FROM (SELECT dept , avg(salary) as avg_sal from Employee e  GROUP BY dept HAVING dept in ('Admin','IT')); 

12:04:44 SELECT max(avg_sal), min(avg_sal) FROM (SELECT dept, avg(salary) as avg_sal от Employee e GROUP BY dept HAVING dept in ('Admin','IT')) LIMIT 0, 1000 Ошибка Код: 1248. Каждая производная таблица должна иметь свой псевдоним 0,000 сек.

Корпус:2

SELECT max(avg_sal), min(avg_sal) 
FROM (SELECT dept , avg(salary) as avg_sal from Employee e  GROUP BY dept HAVING dept in ('Admin','IT')) as dept; 

тогда я получаю

SELECT max(avg_sal), min(avg_sal) FROM (SELECT dept, avg(salary) в качестве avg_sal из Employee e GROUP BY dept Имея dept в ('Admin', 'IT')) как dept;

Отдел

@Entity
public class Dept {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
}

Работник

@Entity
@NamedQuery(name = "Employee.findMaxSalariesByDept", 
            query = "SELECT e.dept, MAX(e.salary) FROM Employee e GROUP BY e.dept.name HAVING e.dept.name in ?1")
public class Employee {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @ManyToOne(cascade = CascadeType.ALL)
    private Dept dept;
    private int salary;
}

Показать таблицу:

CREATE TABLE `employee` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `name` varchar(255) DEFAULT NULL,
   `salary` int(11) NOT NULL,
   `dept_id` int(11) DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `FKfow2bhgypdy2ij4oyukrn6cqw` (`dept_id`)
 ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

1 ответ

В первом случае вам понадобится псевдоним таблицы для предложения FROM(), например: FROM () T

SELECT max(T.avg_sal)
    , min(T.avg_sal) 
FROM ( 
    SELECT dept_id dept, avg(salary) as avg_sal 
    from Employee e  
    GROUP BY dept_id
    WHERE dept_id  in ('Admin','IT')
) T  ; 

и вы должны использовать там, где нет фильтра

Второй случай (не используйте для псевдонима таблицы то же имя, которое вы используете для столбца, например:dept, но используйте t_dept)

SELECT max(t_dept.avg_sal), min(t_dept.avg_sal) 
FROM ( 
  SELECT dept_id dept, avg(salary ) as avg_sal 
   from Employee e  
   WHERE  dept_id in ('Admin','IT')
  GROUP BY dept
) as t_dept; 

и вы можете использовать где для фильтра сделать тот факт, что эти значения не рассчитываются, но доступны в содержимом строк

Другие вопросы по тегам