运行查询时无结果(空白)-尝试从3个表中得出结果

时间:2019-07-11 18:11:59

标签: mysql sql oracle ansi

我有以下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和相应的操作系统信息相关联。不确定我哪里出问题了吗?

1 个答案:

答案 0 :(得分:0)

用于联接操作的旧式逗号语法在逻辑上等效于较新的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不需要使用它。