2014-09-09 5 views
0

J'ai un Table1 comme ceci:Sql requête de sélection basée sur une valeur de colonne

ApplicableTo IdApplicable 
--------------------------- 
Dept    1 
Grade    3 
section   1 
Designation  2 

Il d'autres tables comme:

tblDept:

ID  Name 
1  dept1 
2  baking 
3  other 

tblGrade:

ID  Name 
1  Grd1 
2  Manager 
3  gr3 

tblSection:

id  Name 
1  Sec1 
2  sec2 
3  sec3 

tblDesignation:

id  Name 
1  Executive 
2  Developer 
3  desig3 

Ce que je besoin est une requête pour table1 de telle manière qui me donne

ApplicableTo (table1) 
Name (from the relevant table based on the value in `ApplicableTo` column) 

Est-ce possible?

Résultat souhaité:

eg: ApplicableTo IdApplicable Name 
     Dept   1  dept1 
     grade   3  gr3 
     Section   1  sec1 
     Designation  2  Developer. 

Ceci est le résultat que je désire.

+0

Pouvez-vous envoyer un échantillon résultat de la requête désirée, je ne pouvais pas comprendre le résultat attendu. – yalpertem

+0

Je veux la colonne applicablesaux de table1 comme il est, mais à la place de IdApplicable Je veux que le nom de la table relavant ... –

+0

par exemple: applicablesaux IdApplicable Nom département 1 dept1 grade 3 GR3 Section 1 SEC1 Désignation 2 Developer . C'est le résultat que je désire. –

Répondre

0

Vous pouvez utiliser CASE ici,

SELECT ApplicableTo, 
     IdApplicable, 
     CASE 
     WHEN ApplicableTo = 'Dept' THEN (SELECT Name FROM tblDept WHERE tblDept.ID = IdApplicable) 
     WHEN ApplicableTo = 'Grade' THEN (SELECT Name FROM tblGrade WHERE tblGrade.ID = IdApplicable) 
     WHEN ApplicableTo = 'Section' THEN (SELECT Name FROM tblSection WHERE tblSection.ID = IdApplicable) 
     WHEN ApplicableTo = 'Designation' THEN (SELECT Name FROM tblDesignation WHERE tblDesignation.ID = IdApplicable) 
     END AS 'Name' 
FROM Table1 
+0

un frère de ton ... Vive !!! –

0

La meilleure façon d'y arriver est d'ajouter une colonne supplémentaire dans le tableau 1 pour maintenir la table où id est refferred à. Sinon, vous ne pouvez pas savoir dans quelle table l'ID applicable est renvoyé.

Ou vous pouvez créer l'identifiant applicable d'une manière que vous pouvez extraire la table postfaces de celui-ci par exemple a1 pour id 1 tblDept. Et puis utilisez [cas] (http://dev.mysql.com/doc/refman/5.0/en/case.html) (pour mysql) afin de faire le bon d'inscription.

+0

la table appelée est connue par la colonne applicablesaux ... Merci –

2

Vous pouvez faire quelque chose comme ce qui suit ainsi le applicable à devient une partie du prédicat JOIN:

SELECT t1.ApplicableTo, t1.IdApplicable, n.Name 
FROM Table1 AS t1 
     INNER JOIN 
     ( SELECT ID, Name, 'Dept' AS ApplicableTo 
      FROM tblDept 
      UNION ALL 
      SELECT ID, Name, 'Grade' AS ApplicableTo 
      FROM tblGrade 
      UNION ALL 
      SELECT ID, Name, 'section' AS ApplicableTo 
      FROM tblSection 
      UNION ALL 
      SELECT ID, Name, 'Designation' AS ApplicableTo 
      FROM tblDesignation 
     ) AS n 
      ON n.ID = t1.IdApplicable 
      AND n.ApplicableTo = t1.ApplicableTo 

Je généralement déconseiller cette approche, même si elle peut sembler une approche plus Concise, vous seriez mieux avoir 4 colonnes nullables séparées dans votre table:

ApplicableTo | IdDept | IdGrade | IdSection | IdDesignation 
-------------+--------+---------+-----------+--------------- 
Dept   | 1 | NULL | NULL |  NULL 
Grade  | NULL | 3 | NULL |  NULL 
section  | NULL | NULL |  1 |  NULL 
Designation | NULL | NULL | NULL |  2 

Cela vous permet d'utiliser les clés étrangères pour gérer votre intégrité référentielle correctement.

Questions connexes