Se hai davvero bisogno A_or_B_IDdi TableZ, hai due opzioni simili:
1) Aggiungi nullable A_IDe B_IDcolonne alla tabella z, crea A_or_B_IDuna colonna calcolata usando ISNULL su queste due colonne e aggiungi un vincolo CHECK in modo tale che solo uno di A_IDo B_IDnon sia nullo
2) Aggiungere una colonna TableName alla tabella z, vincolata a contenere A o B. ora creare A_IDe B_IDcome colonne calcolate, che sono solo non nulle quando viene denominata la tabella appropriata (utilizzando l'espressione CASE). Falli persistere anche tu
In entrambi i casi, ora hai A_IDe B_IDcolonne che possono avere chiavi esterne appropriate per le tabelle di base. La differenza è in quali colonne vengono calcolate. Inoltre, non è necessario TableName nell'opzione 2 sopra se i domini delle 2 colonne ID non si sovrappongono, a condizione che l'espressione del tuo caso possa determinare in quale dominio A_or_B_ID
rientra
(Grazie al commento per aver corretto la mia formattazione)