从两个连接表中选择数据

时间:2013-03-28 06:58:18

标签: sql select

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

是否存在快速(直接)方法从两个表(CarsUsers)中选择数据而不使用'inner join'语句将Users加入Users_Cars_Join并且再使用这一次加入Users_Cars_joinCars

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

汽车:

  • 编号
  • 名称

用户:

  • 编号
  • 名称

Users_Cars_Join:

  • 编号
  • 用户ID
  • CarId

2 个答案:

答案 0 :(得分: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了解演示

答案 1 :(得分: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表示哪个用户拥有此车。此外,carid表格中的car_sales是指carid表格中的唯一car

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

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

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