我有3张桌子。
1个主表 - 包含列的组件 - ID,name_of_component,ID_component
和2个组件表
首先 - 带列的硬盘 - ID,容量
秒 - 带列的RAM - ID,速度
在主表中我有组件的ID,它的详细信息在表硬盘或RAM中。列name_of_component选择硬盘或RAM,ID_component从所选表中选择正确的详细信息。
例如,假设在主表中就是这一行并在RAM表中有两行
我试过这样的事情
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语句。
答案 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'