【问题标题】:No results (blank) upon running the Query - trying to result from 3 tables运行查询时没有结果(空白) - 尝试从 3 个表中得到结果
【发布时间】:2019-11-21 12:33:16
【问题描述】:

我有以下 MYSQL 查询 - 尝试加入 3 个表并找到唯一(不同)信息(数据)

SELECT a.LocationID, a.Model, a.SerialNum,a.Purpose, b.IP, a.Services,a.DeviceID, COUNT(a.Hostname)
FROM RefConnection.Equipment_Info a, RefConnection.Connections b, RefConnection.VM_Info c
JOIN Equipment_Info on b.Hostname = a.Hostname
WHERE a.Hostname = c.Hostname
  AND b.status = a.Status
  AND a.status = c.Status
GROUP BY a.LocationID, a.Model, a.SerialNum, a.Purpose, b.IP, a.Services, a.DeviceID
ORDER BY COUNT(b.Hostname)DESC;

这适用于 2 个表:

SELECT d.locationID, d.Model, d.SerialNum, d.Status, da.IP, COUNT(d.HOSTNAME)
FROM RefConnection.Equipment_Info d, RefConnection.Connections da
WHERE d.Hostname = da.Hostname
  AND d.Status = da.Status
Group By d.locationID, d.Model, d.locationID, d.Model, d.SerialNum, d.Status, da.IP
ORDER BY COUNT(da.Hostname) DESC;

“on 子句”中的未知列“b.Hostname”

Select b.LocationID, b.Model, b.SerialNum, a.Purpose, a.IP, b.Services,b.DeviceID,c.applications,c.OS, Count(a.Hostname)
FROM RefConnection.Equipment_Info b JOIN
 RefConnection.Connections a
     ON a.Hostname = b.Hostname AND
    a.status = b.Status JOIN
 RefConnection.VM_Info c
     ON b.Hostname = c.Hostname AND
    b.status = c.Status
group by b.LocationID, b.Model, b.SerialNum, a.Purpose, a.IP, b.Services, b.DeviceID, c.applications, c.OS
order by COUNT(b.Hostname)desc;

运行此查询 - 期望 a 显示连接来自 RefConnection 的所有 3 个表的输出,因为所有 3 个表(Connections、Equipment_info、VM_Info)包含(主机名、状态)。 (Equipment_Info 和 VM_Info) 表包含 (LocationID, OS)。尝试获取应该与位置 ID 和相应操作系统信息相关联的唯一(不同)主机名及其状态。不知道我哪里出错了?

【问题讨论】:

  • 这与 Oracle 有什么关系?

标签: mysql sql oracle ansi


【解决方案1】:

用于连接操作的老式逗号语法在逻辑上等同于较新的 JOIN 关键字。但是优先顺序不同。

参考:https://dev.mysql.com/doc/refman/8.0/en/join.html

摘录:

INNER JOIN,(逗号)在没有连接条件的情况下在语义上是等价的:两者都在指定的表之间产生笛卡尔积(也就是说,第一个表中的每一行都连接到每个表,并且第二个表中的每一行)。

但是,逗号运算符的优先级低于INNER JOINCROSS JOINLEFT JOIN 等。如果在存在连接条件时将逗号连接与其他连接类型混合,则可能会出现Unknown column 'col_name' in 'on clause' 形式的错误。本节稍后会提供有关处理此问题的信息。


最佳做法是不要在同一语句中混合使用逗号语法和 JOIN 语法。

新 SQL 的最佳实践是避免使用逗号语法。对旧版 SQL 的支持很棒。但是新的 SQL 不需要使用它。

【讨论】:

  • 问题指的是第三个代码块 - 其中避免了逗号。
  • 我们不希望第三条 SQL 语句抛出错误 Unknown column 'b.Hostname' in 'on clause'(这是问题正文中显示的错误。)我们假设 hostname 是对RefConnection.Equipment_Info 中的列的有效引用(成功完成第二条 SQL 语句就是证明)。这是FROM 子句中引用的第一个表/视图。
  • 如果问题不是关于第一个 SQL 语句,那么为什么问题包括该 SQL 语句以及预期的错误消息('on 子句'中的未知列'b.Hostname')?根本不清楚要问什么问题。
  • 我确实将它作为一个新问题发布,不知道为什么它选择了已解决的上一个问题。您是否可以查看最后一个 SQL 代码以及为什么它没有显示任何结果?我有点迷路了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多