1

我有 2 张桌子: UsersCars. 这些表连接在第三个表中:Users_Cars_Join.

是否有任何快速(直接)方法可以从两个表(CarsUsers)中选择数据,而不使用'inner join'语句来加入UsersUsers_Cars_Join而不是再使用一次来Users_Cars_join加入Cars

我想知道它应该如何正确和专业地完成。

汽车:

  • ID
  • 姓名

用户:

  • ID
  • 姓名

用户_汽车_加入:

  • ID
  • 用户身份
  • 车牌号
4

2 回答 2

2

没有办法绕过链接表,但如果你一直害怕编写连接,你可以创建一个视图来做到这一点

CREATE VIEW UsersCars AS 
SELECT  c.ID AS CarID
        , c.Name AS CarName
        , u.ID AS UserID
        , u.Name AS UserName
FROM    Cars c
        INNER JOIN Users_Cars_Join ucj ON ucj.CarID = c.ID
        INNER JOIN Users u ON u.ID = ucj.UserID

使用视图就像

SELECT * FROM UsersCars

请参阅此SQL Fiddle以获取演示

于 2013-03-28T07:12:37.330 回答
1

您可以使用旧的 stye 加入这样的表:

SELECT c.id, c.name, u.id, u.name, ...
  FROM cars c, users u, user_cars_join uc
 WHERE u.id = uc.userid
   AND c.id = uc.carid

注意事项:

  1. user_cars_join表的存在是因为它表示用户与其汽车之间的多对多关系。如果从结构中删除此表,则userscars表不再相关。

  2. 您需要了解一对一、一对多和多对多关系的现象。

    • 一对一关系是一组中的一个实体仅与另一组中的一个实体相关。在您的情况下,一个用户只拥有一辆车,这是不切实际的。一个人可以拥有多辆汽车。

    • 一对多关系是一组中的一个实体与另一组中的多个实体相关,并且另一组中的一个实体仅与第一组中的一个实体相关。在您的情况下,一个用户拥有多辆汽车,但一辆车由一个用户拥有。你可以有这种关系,尤其是当汽车有注册号时。架构看起来像这样:

      User (userid, name)
      car_sales (carid, userid, registration_number)
      Car (carid, name, brand, model)
      

      请注意,userid表中的car_sales表示哪个用户拥有这辆车。此外,caridincar_sales表指的是唯一carid的 incar表。

      另请注意,在此模型中,一个用户可以拥有多辆汽车。一种型号的汽车可以将多个实例(其中的项目)出售给多个用户。

      这是表示这些关系的最广泛使用和可接受的模型。

    • 如您的示例中所实现的,多对多关系是指一组中的多个实体与另一组中的多个实体相关,反之亦然。必须有一个单独的关系表来表示实体之间的关系,在您的情况下就是该user_car_join表。

于 2013-03-28T07:05:38.737 回答