Imbrication des requêtes SQL dans le boîtier

J'essaie d'écrire une requête SQL où je joins deux tables et récupère quelques colonnes. Une fois cela fait, basé sur deux champs (table source enum, id dans la table source correspondante), j'ai besoin de récupérer une valeur correspondant à l'id dans la table source.

Le problème est que je ne peux pas join toutes les tables source et que je veux faire quelque chose comme ça:

Select X.Col1, X.Col2, Y.Col1, Y.Col2, CASE WHEN Y.TableID = 4 THEN Select t4.Col1 FROM TableFour t4 WHERE t4.id = Y.FileID WHEN Y.TableID = 5 THEN Select t5.Col4 FROM TableFive t5 WHERE t5.id = Y.FileID END FROM Table X INNER JOIN Table Y ON X.ID = Y.XID 

Je peux garantir que la valeur récupérée de toutes les tables sources sera la même (ie nvarchar).

L'imbrication des requêtes SQL à l'intérieur de l'instruction CASE ne semble pas fonctionner, je vous lance les gars. Des idées avec ce problème?

J'espère avoir expliqué la question correctement. Si vous n'êtes pas sûr, faites un commentaire pour que je puisse le clarifier.

Bravo à l'avance!

Je ne comprends pas ce que vous voulez dire par "ne peut pas joindre toutes les tables sources", pouvez-vous élaborer? J'utiliserais des jointures externes:

 Select X.Col1, X.Col2, Y.Col1, Y.Col2, COALESCE(t4.Col1 ,t5.Col4) END FROM Table X INNER JOIN Table Y ON X.ID = Y.XID LEFT OUTER JOIN TableFour t4 ON t4.id = Y.FileID AND Y.TableID = 4 LEFT OUTER JOIN TableFive t5 ON t5.id = Y.FileID AND Y.TableID = 5 

Utilisez des crochets pour encapsuler le SELECT dans l'expression CASE:

 Select X.Col1, X.Col2, Y.Col1, Y.Col2, CASE WHEN Y.TableID = 4 THEN (Select t4.Col1 FROM TableFour t4 WHERE t4.id = Y.FileID) WHEN Y.TableID = 5 THEN (Select t5.Col4 FROM TableFive t5 WHERE t5.id = Y.FileID) END FROM Table X JOIN Table Y ON X.ID = Y.XID 

… mais je voudrais souligner que c'est un mauvais choix de design. Vous pouvez utiliser LEFT JOINs à la place:

  Select X.Col1, X.Col2, Y.Col1, Y.Col2, CASE WHEN Y.TableID = 4 AND t4.Col1 IS NOT NULL THEN t4.Col1 WHEN Y.TableID = 5 AND t5.Col4 IS NOT NULL THEN t5.Col4 END FROM Table X JOIN Table Y ON X.ID = Y.XID LEFT JOIN TABLEFOUR t4 ON t4.id = y.fileid LEFT JOIN TABLEFIVE t5 ON t5.id = y.fileid 

J'écrirais probablement une fonction pour ceci:

 CREATE FUNCTION dbo.GetVal (@tblNum int, @FileID int) RETURNS nvarchar(255) AS BEGIN Declare @return nvarchar(255); if @tblNum = 4 then Select @return=t4.Col1 FROM TableFour t4 WHERE t4.id = @FileID; else if @tblNum =5 Select @return=t5.Col4 FROM TableFive t5 WHERE t5.id = @FileID; return @return END; 

Alors votre sélection ressemble à:

 Select X.Col1, X.Col2, Y.Col1, Y.Col2, dbo.GetVal(Y.TableID, Y.FileID) FROM Table X INNER JOIN Table Y ON X.ID = Y.XID