Как связать эти три таблицы с предложением WHERE? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть 3 таблицы с этими столбцами:

ITV2_HIST_DEFECTOS_INSPECCION: (~ 500 строк)

C_ESTACION_ID (FK)
N_ANNO
C_INSPECCION_ID (FK)
C_SECCION_ID
C_DEFECTO_ID   (PK)
C_DEFECTO
C_CALIFICACION
U_CREACION
F_CREACION
U_MODIF
F_MODIF
N_ORDEN

ITV2_HIST_INSPECCIONES (~ 400 строк)

C_ESTACION_ID (FK)
N_ANNO
C_INSPECCION_ID (PK)
C_VEHICULO_ID (FK)
N_FASE
N_KILOMETROS
N_HORAS
C_RESULTADO
C_TIPO_INSPECC_ID (FK)
C_TIPO_INSPECCION

ITV2_HIST_VEHICULOS (~ 500 строк)

C_VEHICULO_ID (PK)
F_CAMBIO
N_BASTIDOR
A_MATRICULA
A_MARCA
A_MODELO
C_CLASIF_VEH_CONS_ID (FK)
C_CLASIF_VEH_USO_ID (FK)
C_CATEGORIA_ID (FK)
A_TIPO_VEHICULO

Я пытаюсь связать 3 таблицы с этим запросом:

 SELECT         
    INSP.C_ESTACION_ID AS ESTACION,
    INSP.C_RESULTADO AS RESULTADO,
    INSP.C_VEHICULO_ID AS C_VEHICULO_ID,
    VEHI.A_MATRICULA AS MATRICULA                            
    FROM 
    ITV2_HIST_DEFECTOS_INSPECCION DEF,
    ITV2_HIST_INSPECCIONES INSP, 
    ITV2_HIST_VEHICULOS VEHI
    WHERE               
    DEF.C_INSPECCION_ID=INSP.C_INSPECCION_ID 
    AND DEF.C_ESTACION_ID= INSP.C_ESTACION_ID
    AND INSP.C_VEHICULO_ID=VEHI.C_VEHICULO_ID 

Но я получаю 100.000 результатов. Где ошибка?

1 Ответ

0 голосов
/ 05 ноября 2018

Без дополнительной информации трудно сказать, но ваша логика выглядит правильно: ITV2_HIST_VEHICULOS 1: n ITV2_HIST_INSPECCIONES 1: n ITV2_HIST_DEFECTOS_INSPECCION, это должно вернуть не более 500 строк из таблицы дефектов.

Добавление DISTINCT может дать вам правильный результат, но все равно что-то не так.

Поскольку вы не возвращаете информацию о дефектах, вы хотите знать только о транспортных средствах с дефектами, обнаруженными в ходе проверки:

 SELECT         
    INSP.C_ESTACION_ID AS ESTACION,
    INSP.C_RESULTADO AS RESULTADO,
    INSP.C_VEHICULO_ID AS C_VEHICULO_ID,
    VEHI.A_MATRICULA AS MATRICULA                            
 FROM ITV2_HIST_VEHICULOS VEHI
 JOIN ITV2_HIST_INSPECCIONES INSP
   ON INSP.C_VEHICULO_ID=VEHI.C_VEHICULO_ID 
 WHERE EXISTS
  ( -- any defects recorded for this inspection?
    SELECT * 
    FROM ITV2_HIST_DEFECTOS_INSPECCION DEF
    WHERE DEF.C_INSPECCION_ID=INSP.C_INSPECCION_ID 
      AND DEF.C_ESTACION_ID= INSP.C_ESTACION_ID
  )

Edit:

Поскольку у вас есть несколько рядов для одного и того же транспортного средства, вам необходимо применить DISTINCT перед объединением:

 SELECT         
    INSP.C_ESTACION_ID AS ESTACION,
    INSP.C_RESULTADO AS RESULTADO,
    INSP.C_VEHICULO_ID AS C_VEHICULO_ID,
    VEHI.A_MATRICULA AS MATRICULA                            
 FROM ITV2_HIST_INSPECCIONES INSP
 JOIN
   ( -- hopefully there's only one A_MATRICULA per C_VEHICULO_ID
     -- otherwise switch to aggregation
     -- SELECT C_VEHICULO_ID, MAX(A_MATRICULA)
     -- FROM ITV2_HIST_VEHICULOS
     -- GROUP BY C_VEHICULO_ID
     SELECT DISTINCT C_VEHICULO_ID, A_MATRICULA
     FROM ITV2_HIST_VEHICULOS
   ) VEHI
 ON INSP.C_VEHICULO_ID=VEHI.C_VEHICULO_ID 
 WHERE EXISTS
  ( -- any defects recorded for this inspection?
    SELECT * 
    FROM ITV2_HIST_DEFECTOS_INSPECCION DEF
    WHERE DEF.C_INSPECCION_ID=INSP.C_INSPECCION_ID 
      AND DEF.C_ESTACION_ID= INSP.C_ESTACION_ID
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...