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

Mysql 在sql查询中从另一个表引用表的名称,mysql,sql,mysql-workbench,oracle-sqldeveloper,Mysql,Sql,Mysql Workbench,Oracle Sqldeveloper,我有三张桌子 1主表-带列的组件-ID、组件的名称、ID 和2个组件表 第一个-带列的硬盘-ID,容量 第二个-带列的RAM-ID,速度 在主表中,我有组件的ID,其详细信息在表hardisk或RAM中。_组件的列名_选择硬盘或RAM,ID_组件从所选表中选择正确的详细信息 例如,让我们假设主表中是这一行 1,RAM,2 RAM表中有两行 1,2GB 2,4GB 我试过这样的东西 Select * from (Select name_of_component from Compo

我有三张桌子

1主表-带列的组件-ID、组件的名称、ID

和2个组件表

第一个-带列的硬盘-ID,容量

第二个-带列的RAM-ID,速度

在主表中,我有组件的ID,其详细信息在表hardisk或RAM中。_组件的列名_选择硬盘或RAM,ID_组件从所选表中选择正确的详细信息

例如,让我们假设主表中是这一行

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和图形卡的详细信息,因为它们有不同的详细信息。那我该怎么做呢

语法错误是
您输入的SQL语句包含无效的FROM子句。

您不能在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
由于_组件的名称_同时只能是这些值中的一个,因此联合的一部分将不返回任何值,而另一部分将返回正确的部分。
但这只有在两个表的列数相同时才能起作用。如果这两个表具有相似的布局,那么您可能不需要两个表。

由于以下几个原因,您无法使用简单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;
另一种方法是使用左联接:

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

您可能会发现EAV实体属性值结构在为此目的表示此数据方面做得更好。主表将包含组件、id和类型。第二个表将列出所有组件的功能,行如下:

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

你有语法错误,对吗?你应该加上这个。并决定使用哪种sql方言。mysql和sql server是不同的,我不相信你们的问题是关于这个查询在这两个引擎中是如何工作的……我不在乎答案是在mysql还是在Oracle中,我只需要一个答案:是的,对不起,我做了错误的标记。。。我编辑了它。。。他们现在没事了是的,我考虑过这样的事情,但我想按照我描述的方式尝试一下,因为如果我不会只有两个组件呢?但例如100?那么你必须为他们所有人做这个联合/您始终可以通过调用SQL的宿主语言来执行此操作:首先读取组件,然后使用正确的表名构建SQL。您也可以在一些rdbms中的存储过程中执行此操作,但我认为在mysql中不可以执行此操作,请参见。或者检查执行此操作的方法。
id   attribute     value
1    'RAM'         '2GB'
2    'RAM'         '4GB'
3    'Speed'       '7kRPM'