从sql查询中的另一个表引用表的名称

时间:2015-04-11 10:08:46

标签: mysql sql mysql-workbench oracle-sqldeveloper

我有3张桌子。

1个主表 - 包含列的组件 - ID,name_of_component,ID_component

和2个组件表

首先 - 带列的硬盘 - ID,容量

秒 - 带列的RAM - ID,速度

在主表中我有组件的ID,它的详细信息在表硬盘或RAM中。列name_of_component选择硬盘或RAM,ID_component从所选表中选择正确的详细信息。

例如,假设在主表中就是这一行

  • 1,RAM,2

并在RAM表中有两行

  • 1,2GB
  • 2,4GB

我试过这样的事情

Select * 
from (Select name_of_component 
      from Component 
      where ID=1) 
join Component on (Select name_of_component 
                   from Component 
                   where ID=1).ID = Component.ID_component

但它不起作用。那么有什么办法,如何从表中调用哪个名称从另一个表中选择?我不能使用一个表来获取RAM和图形卡的详细信息,因为它们有不同的细节。那我怎么能这样做呢?

语法错误是 您输入了一个具有无效FROM子句的SQL语句。

2 个答案:

答案 0 :(得分:0)

你不能在SQL本身那样做。我想你可以做一个工会:

select * from ram join component on ram.id=component.id where component.name_of_component='RAM' and component.id=myid
union 
select * from harddisk join component on ram.id=component.id where component.name_of_component='harddisk' and component.id=myid

由于name_of_component只能同时是这些值中的一个,因此union的一部分将不返回任何内容,另一部分将返回正确的部分。 但这只能在两个表具有相同列数的情况下才能工作。如果两个表具有相似的布局,则可能不需要两个表。

答案 1 :(得分:0)

由于多种原因,您无法使用简单的SQL执行所需操作。最明显的是SQL查询返回一组固定的列,并且在编写代码时定义这些列。

解决这个限制的方法是使用预备语句,例如:

select @t = name_of_component
from MainTable
where id = 1;

select @sql = replace(replace('select * from @table where id = @i',
                              '@i', 1
                             ), '@table', @t);

prepare stmt from @sql;
execute stmt;

另一种方法是使用left join

select mt.id, r.ram, hd.speed
from MainTable mt left join
     RAM r
     on mt.id = r.id left join
     HardDisk hd
     on mt.id = hd.id;

您想要的值将位于相应的列中。你可以把它放在一个视图中。

您可能会发现EAV(实体 - 属性 - 值)结构可以更好地为此目的表示此数据。您的主表将具有组件,ID和类型。第二个表将列出所有组件的功能,其行如:

id   attribute     value
1    'RAM'         '2GB'
2    'RAM'         '4GB'
3    'Speed'       '7kRPM'