2014-09-09 2 views
0

У меня есть Table1 вроде этого:Sql запрос на выборку на основе значения столбца

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

Там другие таблицы, как:

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 

Что мне нужно, это запрос для table1 таким образом, что дает мне

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

Возможно ли это?

Желаемый результат:

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

Это результат я хочу.

+0

Вы можете разместить образец желаемого результата запроса, я не мог понять, ожидаемый результат. – yalpertem

+0

Я хочу, чтобы столбец ApplicableTo из table1, как она есть, но в месте IdApplicable Я хочу, чтобы имя из relavant таблицы ... –

+0

например: ApplicableTo IdApplicable Имя Dept 1 dept1 класс 3 gr3 Раздел 1 сек1 Обозначение 2 Разработчик , Это результат, которого я желаю. –

ответ

0

Вы можете использовать СЛУЧАЙ здесь,

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

Спасибо, тонный брат ... Приветствия !!! –

0

Самый простой способ добиться этого - добавить дополнительный столбец в таблице1, чтобы сохранить таблицу, в которой идентификатор возвращен. В противном случае вы не можете знать, в какой таблице указан соответствующий идентификатор.

Или вы можете создать применимый идентификатор таким образом, чтобы вы могли извлечь из него таблицы после этого, например a1 для id 1 в tblDept. И затем используйте [case] (http://dev.mysql.com/doc/refman/5.0/en/case.html) (для mysql), чтобы сделать правильный Присоединиться.

+0

Стол, о котором идет речь, известен в столбце ApplicableTo ... –

2

Вы могли бы сделать что-то вроде следующего, так что применимо к становится частью предиката:

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 

я обычно советую против такого подхода, хотя это может показаться более consice подход, вы бы лучше с 4 отдельных NULLABLE столбцов в таблице:

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 

Это позволяет использовать внешние ключи для управления ссылочной целостности правильно.

Смежные вопросы