Без дополнительной информации трудно сказать, но ваша логика выглядит правильно: 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
)