我有 2 张桌子:
Users
和Cars
. 这些表连接在第三个表中:Users_Cars_Join
.
是否有任何快速(直接)方法可以从两个表(Cars
,Users
)中选择数据,而不使用'inner join'
语句来加入Users
,Users_Cars_Join
而不是再使用一次来Users_Cars_join
加入Cars
?
我想知道它应该如何正确和专业地完成。
汽车:
- ID
- 姓名
用户:
- ID
- 姓名
用户_汽车_加入:
- ID
- 用户身份
- 车牌号
没有办法绕过链接表,但如果你一直害怕编写连接,你可以创建一个视图来做到这一点
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以获取演示
您可以使用旧的 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
注意事项:
该user_cars_join
表的存在是因为它表示用户与其汽车之间的多对多关系。如果从结构中删除此表,则users
和cars
表不再相关。
您需要了解一对一、一对多和多对多关系的现象。
一对一关系是一组中的一个实体仅与另一组中的一个实体相关。在您的情况下,一个用户只拥有一辆车,这是不切实际的。一个人可以拥有多辆汽车。
一对多关系是一组中的一个实体与另一组中的多个实体相关,并且另一组中的一个实体仅与第一组中的一个实体相关。在您的情况下,一个用户拥有多辆汽车,但一辆车由一个用户拥有。你可以有这种关系,尤其是当汽车有注册号时。架构看起来像这样:
User (userid, name)
car_sales (carid, userid, registration_number)
Car (carid, name, brand, model)
请注意,userid
表中的car_sales
表示哪个用户拥有这辆车。此外,carid
incar_sales
表指的是唯一carid
的 incar
表。
另请注意,在此模型中,一个用户可以拥有多辆汽车。一种型号的汽车可以将多个实例(其中的项目)出售给多个用户。
这是表示这些关系的最广泛使用和可接受的模型。
如您的示例中所实现的,多对多关系是指一组中的多个实体与另一组中的多个实体相关,反之亦然。必须有一个单独的关系表来表示实体之间的关系,在您的情况下就是该user_car_join
表。