程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了表上的 SQL 联接大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决表上的 SQL 联接?

开发过程中遇到表上的 SQL 联接的问题如何解决?下面主要结合日常开发的经验,给出你关于表上的 SQL 联接的解决方法建议,希望对你解决表上的 SQL 联接有所启发或帮助;

试图加入这些表以获得所需的列(见图 1),但在第三个条目之后,我得到了重复的行。所以我的问题是对 ID 值的内部连接会解决这个问题吗?

表上的 SQL 联接

来自...

SELEct m.make,m.model,car.price,color.color,car.mileage,carlot.lotID
from makemodel as m,color,carlot,car;

表上的 SQL 联接

解决方法

您实际上需要在 hwich 下指定应连接行的条件。

你写的是……

  • 拿@H_22_14@makemodel桌
  • 对于每一行,复制它并将其与 color 表中的每一行连接
  • 对于您现在拥有的每一行,复制它并将其与 carlot 表中的每一行结合
  • 对于您现在拥有的每一行,复制它并将其与 car 表中的每一行结合

这被称为 CROSS JOIN 或“笛卡尔积”。

为避免此类错误,请勿使用 , 将表连接在一起。请改用 JOIN 语法。 (近 30 年前被采用为 ANSI-92 标准。您使用的语法已经过时了近 3 年。)

SELECT
  m.make,m.model,car.price,color.color,car.mileage,carlot.lotid
FROM
  makemodel as m
INNER JOIN
  car
    ON car.mmid = m.mmid
INNER JOIN
  color
    ON color.colorid = car.colorid
INNER JOIN
  carlot
    ON carlot.carid = car.carid
,

您没有在此处使用 join。您正在使用 4 个表的 cartesian product(或 cross join)。所以每一行的所有值都会被复制。

您需要添加 where 子句并在那里加入:

SELEct m.make,carlot.lotid
from makemodel as m,color,carlot,car
where m.mmid=car.mmid and car.colorid=color.colorid and carlot.carid=car.carid
;

正如@Ken White 所建议的那样,最好在此处使用连接语法。我不同意逗号分隔是不好的做法,它有它的用途,但事实并非如此。

您可以将查询重写为

SELEct m.make,carlot.lotid
from car
join makemodel as m ON m.mmid=car.mmid
join color ON  car.colorid=color.colorid
join carlot ON  carlot.carid=car.carid

这将使意图更清晰,代码更具可读性。现在我们可以看到 car 是主表。

此外,如果您使用的是上帝遗弃的 MySQL(我的意思是在我看来它是非常糟糕的数据库),那么它具有自然连接的功能,您可以将其重写如下:

SELEct m.make,carlot.lotid
from car
natural join makemodel as m 
natural join color 
natural join carlot 

它会自动连接同名的列。也许此功能会诱使您编写以逗号分隔的表格。当列在不同表中具有相同名称时,此功能很有用,但它是有争议的,因为从代码中不清楚如何执行连接。我建议不要过多依赖此功能。

大佬总结

以上是大佬教程为你收集整理的表上的 SQL 联接全部内容,希望文章能够帮你解决表上的 SQL 联接所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。