2016-09-19 1 views
0

Я почти там, но нужно немного толкнуть.MySQL. Создание представления с использованием подзапроса. Несколько таблиц

У меня есть следующие таблицы:

EMPLEADOS (сотрудников):

+--------+----------+------------+----------+------------+---------+----------+--------+ 
| EMP_NO | APELLIDO | OFICIO  | DIRECTOR | FECHA_ALTA | SALARIO | COMISION | DEP_NO | 
+--------+----------+------------+----------+------------+---------+----------+--------+ 
| 7499 | ALONSO | VENDEDOR |  7698 | 1981-02-23 | 1400.00 | 400.00 |  30 | 
| 7521 | LOPEZ | EMPLEADO |  7782 | 1981-05-08 | 1350.50 |  NULL |  10 | 
| 7654 | MARTIN | VENDEDOR |  7698 | 1981-09-28 | 1500.00 | 1600.00 |  30 | 
| 7698 | GARRIDO | DIRECTOR |  7839 | 1981-05-01 | 3850.12 |  NULL |  30 | 
| 7782 | MARTINEZ | DIRECTOR |  7839 | 1981-06-09 | 2450.00 |  NULL |  10 | 
| 7839 | REY  | PRESIDENTE |  NULL | 1981-11-17 | 6000.00 |  NULL |  10 | 
| 7844 | CALVO | VENDEDOR |  7698 | 1981-09-08 | 1800.00 |  0.00 |  30 | 
| 7876 | GIL  | ANALISTA |  7782 | 1982-05-06 | 3350.00 |  NULL |  20 | 
| 7900 | JIMENEZ | EMPLEADO |  7782 | 1983-03-24 | 1400.00 |  NULL |  20 | 
+--------+----------+------------+----------+------------+---------+----------+--------+ 

CLIENTES (клиенты):

+------------+-------------------------+-----------+-------------+------+-------+----------------+ 
| CLIENTE_NO | NOMBRE     | LOCALIDAD | VENDEDOR_NO | DEBE | HABER | LIMITE_CREDITO | 
+------------+-------------------------+-----------+-------------+------+-------+----------------+ 
|  101 | DISTRIBUCIONES GOMEZ | MADRID |  7499 | 0.00 | 0.00 |  5000.00 | 
|  102 | LOGITRONICA S.L   | BARCELONA |  7654 | 0.00 | 0.00 |  5000.00 | 
|  103 | INDUSTRIAS LACTEAS S.A. | LAS ROZAS |  7844 | 0.00 | 0.00 |  10000.00 | 
|  104 | TALLERES ESTESO S.A. | SEVILLA |  7654 | 0.00 | 0.00 |  5000.00 | 
|  105 | EDICIONES SANZ   | BARCELONA |  7499 | 0.00 | 0.00 |  5000.00 | 
|  106 | SIGNOLOGIC S.A.   | MADRID |  7654 | 0.00 | 0.00 |  5000.00 | 
|  107 | MARTIN Y ASOCIADOS S.L. | ARAVACA |  7844 | 0.00 | 0.00 |  10000.00 | 
|  108 | MANUFACTURAS ALI S.A. | SEVILLA |  7654 | 0.00 | 0.00 |  5000.00 | 
+------------+-------------------------+-----------+-------------+------+-------+----------------+ 

Мне нужно создать представление с использованием столбцов EMP_NO, Apellido и OFICIO из таблицы EMPLEADOS и CLIENTE_NO, NOMBRE из таблицы CLIENTES. Задача состоит в том, чтобы создать представление обо всех сотрудниках и соответствующих им (назначенных) клиентах (ссылка здесь: emp_no в таблице EMPLEADOS такая же, как VENDEDOR_NO в таблице CLIENTES), но список должен включать всех сотрудников, прежде чем те, У них есть клиенты, назначенные им. И этот бит - это то, с чем я борюсь.

Что у меня есть:

create view V_EMPLEADOS (EMP_NO, APELLIDO, OFICIO, CLIENTE_NO, NOMBRE_CL) AS 
    -> select em.emp_no, em.apellido, em.oficio, cl.cliente_no, cl.nombre 
    -> from EMPLEADOS em, CLIENTES cl 
    -> where em.emp_no = cl.vendedor_no; 

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

+1

Вам необходимо прекратить использование неявных объединений. Они были заменены на более чем 20 лет явным присоединением по очень веским причинам. – HLGEM

ответ

4

Вы хотите left join:

create view V_EMPLEADOS (EMP_NO, APELLIDO, OFICIO, CLIENTE_NO, NOMBRE_CL) AS 
    select em.emp_no, em.apellido, em.oficio, cl.cliente_no, cl.nombre 
    from EMPLEADOS em left join 
     CLIENTES cl 
     on em.emp_no = cl.vendedor_no; 

Простое правило: Никогда использовать запятые в предложении FROM. Всегда использовать правильное, явное JOIN синтаксис с условием в условии ON.

+0

спасибо. Это полезный совет. – CNB