Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从两个联接表中选择数据_Sql_Select - Fatal编程技术网

Sql 从两个联接表中选择数据

Sql 从两个联接表中选择数据,sql,select,Sql,Select,我有两张桌子: 用户和汽车。这些表在第三个表中联接:Users\u Cars\u Join 有没有一种快速(直接)的方法可以从两个表(Cars,Users)中选择数据,而不使用内部连接语句将用户连接到Users\u连接到Cars,然后再使用一次将用户连接到Cars 我想知道应该如何正确地、专业地做这件事 汽车: 身份证 名字 用户: 身份证 名字 用户\汽车\加入: 身份证 用户ID 龋齿 您可以使用旧样式连接如下表: SELECT c.id, c.name, u.id, u.name

我有两张桌子:
用户
汽车
。这些表在第三个表中联接:
Users\u Cars\u Join

有没有一种快速(直接)的方法可以从两个表(
Cars
Users
)中选择数据,而不使用
内部连接
语句将
用户连接到
Users\u连接到
Cars
,然后再使用一次将
用户连接到
Cars

我想知道应该如何正确地、专业地做这件事

汽车:

  • 身份证
  • 名字
用户:

  • 身份证
  • 名字
用户\汽车\加入:

  • 身份证
  • 用户ID
  • 龋齿

您可以使用旧样式连接如下表:

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
User (userid, name)
car_sales (carid, userid, registration_number)
Car (carid, name, brand, model)
注意事项:

  • 存在
    user\u cars\u join
    表,因为它表示用户与其汽车之间的多对多关系。如果从结构中删除此表,则
    用户
    车辆
    表不再相关

  • 您需要了解一对一、一对多和多对多关系的现象

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

    • 一对多关系是指一个集合中的一个实体与另一集合中的多个实体相关,而另一集合中的一个实体仅与第一集合中的一个实体相关。在您的情况下,一个用户拥有多辆车,但一辆车由一个用户拥有。你可以有这种关系,特别是当汽车有一个注册号的时候。该模式将如下所示:

      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
      
      User (userid, name)
      car_sales (carid, userid, registration_number)
      Car (carid, name, brand, model)
      
      请注意,
      car\u sales
      表中的
      userid
      表示谁拥有这辆车。此外,
      car\u sales
      表中的
      carid
      指的是
      car
      表中唯一的
      carid

      还要注意的是,在这个模型中,一个用户可以拥有多辆车。一个车型可以有多个实例(项目)出售给多个用户

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

    • 在您的示例中实现的多对多关系是一个集合中的多个实体与另一个集合中的多个实体相关,反之亦然。必须有一个单独的关系表来表示实体之间的关系,在您的例子中是
      user\u car\u join


  • 没有办法绕过linktable,但是如果您一直害怕编写连接,您可以创建一个视图来实现这一点

    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
    

    查看此演示

    我得到了该表结构,我无法更改它。汽车和用户之间的连接是什么?如果您无法更改表结构,我想您将始终必须在Users\u car\u join表上使用联接。没有其他元素可以澄清用户和汽车之间的链接。@Ellbar-视图本质上只是一种快捷方式,可以阻止您编写完整的语句。在select中使用视图时,引擎实际上会用完整的基础语句替换该名称。不过,不要过分热衷于使用视图。当你这样做的时候,把事情弄得一团糟并不困难(可以理解为,如果使用得当,它可以简化事情,但是当一切都变成一个视图时,你将失去概览,性能问题可能会悄然出现)