将SQL服务器中的表作为Super和Sub类型如下所示。现在,如果我必须得到家具清单,那么我该如何获得清单呢?
家具表:
Id FurnituretypeId NoofLegs
-------------------------------
1 1 4
2 2 4
FurnitureType表:
Id Name
-----------------
1 chair
2 cot
3 table
主席表:
Id Name CansSwing CanDetachable FurnitureId
------------------------------------------------------------
1 Chair1 Y Y 1
婴儿床表:
Id Name CotType Storage StorageType FurnitureId
-------------------------------------------------------------------
1 Cot1 Auto Y Drawer 2
我如何获得整个家具清单,因为其中一些是椅子,其中一些是婴儿床。我怎样才能将这些桌子与家具桌一起加入并获取清单?
答案 0 :(得分:0)
union all
和join
?
select cc.*, f.*
from ((select Id, Name, CansSwing, CanDetachable,
NULL as CotType, NULL as Storage, NULL as StorageType, FurnitureId
from chairs
) union all
(select Id, Name, NULL as CansSwing, NULL as CanDetachable,
CotType, Storage, StorageType, FurnitureId
from cots
)
) cc join
furniture f
on cc.furnitureid = f.id;
答案 1 :(得分:0)
这是一个经典的学习问题,这就是为什么我没有给你解决这个问题的代码,而是你需要做的所有见解。
你有多种方法,但我描述了两个简单的方法:
1)使用UNION语句连接两个单独的查询,一个用于主席,另一个用于Cot,请记住两个SELECT都必须返回相同的结构。
SELECT
a1,
a2,
etc..
FROM table1 a1
JOIN table2 a2 ON a1.some = a2.some
UNION
SELECT
a1,
a3,
etc..
FROM table1 a1
JOIN table3 a3 ON a1.some = a3.some
2)你可以在一个SELECT语句中使用LEFT JOIN对两个表进行全部操作,并在select中使用COALESCE或ISNULL来获取一个表或另一个表的值。在WHERE条件中,您必须强制一个或另一个连接不为空。
SELECT
a1,
COALESCE(a2,a3) as col2
FROM table1
LEFT JOIN table2 a2 ON a1.some = a2.some
LEFT JOIN table3 a3 ON a1.some = a3.some
WHERE
a2.some IS NOT NULL
OR a3.some IS NOT NULL
答案 2 :(得分:-1)
将对象映射到关系模型需要一定程度的理解RDBMS中可能的内容和明智的内容。面向对象的数据库系统试图追究这样的问题(通常没有太大的成功),因为问题陈述可能是不正确的。
请考虑将所有这些放在一张桌子上。然后对每个子类型并不重要的字段使用null。最终你可能会更加快乐,因为你可以花更多的时间在运行时进行连接,而只是查询你需要的信息,并在同一个表上使用索引来查找你想要运行的每个查询的禁食路径。
SELECT * FROM CombinedTable;