获取超级和子类型的列表

时间:2018-06-04 18:19:24

标签: sql sql-server

将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

我如何获得整个家具清单,因为其中一些是椅子,其中一些是婴儿床。我怎样才能将这些桌子与家具桌一起加入并获取清单?

3 个答案:

答案 0 :(得分:0)

嗯。嗯。 。 。 union alljoin

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;