Lo que está intentando hacer es asegurarse de que los valores insertados en una tabla existen en otra tabla, es decir, aplicar una clave externa. Por lo que sería:
CREATE TABLE RollingStocks (
...
CONSTRAINT Pk_RollingStocks Primary Key (Id),
CONSTRAINT RollingStocks_CategoryId_FK (RollingStockCategoryId)
REFERENCES FreightWagonTypes (ID)
);
Excepto que desea aplicar una clave externa que hace referencia a dos tablas. Esto no se puede hacer.
Tienes un par de opciones. Una sería fusionar FreightWagonTypes y LocomotiveClasses en una sola tabla. Si necesita tablas separadas para otras partes de su aplicación, entonces podría construir una vista materializada a los efectos de aplicar la clave externa. Las Vistas Materializadas son como tablas y pueden ser referenciadas por claves externas. Esta opción no funcionará si los valores clave para las dos tablas chocan.
Otra opción es reconocer que la presencia de dos tablas candidatas hace referencia a que RollingStock necesita ser dividido en dos tablas, o quizás tres: un super tipo y dos tablas de subtipo, que es RollingStock y FreightWagons, Locomotives .
Por cierto, ¿qué pasa con los entrenadores de pasajeros, los guardabarros y los carros de restaurante?
Otra alternativa es dividir RollingStockCategoryId en dos columnas que admiten nulos, una como FK a FreightWagonTypes y la otra como FK a LocomotiveClasses. Puede agregar una restricción de verificación para decir que uno (y solo uno) no debe ser nulo para ninguna fila. –