mysql - 每个派生表都必须有自己的别名 - *每个*派生表还是仅在每个查询中?

标签 mysql

我在这里有这个查询:

SELECT * FROM 
  (SELECT DISTINCT C1.ToLoc, (SELECT ME1.EquipmentNumber FROM MajorEquipment ME1 WHERE C1.ToLoc = ME1.MEId) AS EquipmentNumber FROM MajorEquipment ME1 
  INNER JOIN CableId C1 ON C.FromLoc = ME1.MEId
  WHERE C1.FromLoc = (SELECT ME1.MEId FROM MajorEquipment ME1 WHERE ME1.EquipmentNumber = 'Equipment'))
UNION
  (SELECT DISTINCT C2.FromLoc, (SELECT ME2.EquipmentNumber FROM MajorEquipment ME2 WHERE C2.FromLoc = ME2.MEId) AS EquipmentNumber FROM MajorEquipment ME2 
  INNER JOIN CableId C2 ON C.FromLoc = ME2.MEId
  WHERE C2.ToLoc = (SELECT ME2.MEId FROM MajorEquipment ME2 WHERE ME2.EquipmentNumber = 'Equipment'));

如您所见,我已将每个查询中引用的表指定为 C1C2 以及 ME1ME2 ,但我仍然收到错误:

Every derived table must have it's own alias

这是否表明我需要为每个引用提供一个唯一的别名?

最佳答案

这是您的查询格式,以便(至少)我可以阅读它:

SELECT *
FROM (SELECT DISTINCT C1.ToLoc,
             (SELECT ME1.EquipmentNumber FROM MajorEquipment ME1 WHERE C1.ToLoc = ME1.MEId) AS EquipmentNumber
      FROM MajorEquipment ME1 INNER JOIN
           CableId C1
           ON C.FromLoc = ME1.MEId
      WHERE C1.FromLoc = (SELECT ME1.MEId FROM MajorEquipment ME1 WHERE ME1.EquipmentNumber = '613-MCC-050')
     ) UNION
     (SELECT DISTINCT C2.FromLoc,
             (SELECT ME2.EquipmentNumber FROM MajorEquipment ME2 WHERE C2.FromLoc = ME2.MEId) AS EquipmentNumber
      FROM MajorEquipment ME2 INNER JOIN
           CableId C2
           ON C.FromLoc = ME2.MEId
      WHERE C2.ToLoc = (SELECT ME2.MEId FROM MajorEquipment ME2 WHERE ME2.EquipmentNumber = '613-MCC-050')
     );
------^

箭头突出显示别名缺失的位置。接下来,我认为 MySQL 不会接受这一点,因为 union 子查询应该都是括号中的单个查询。您可能需要这个:

SELECT *
FROM ((SELECT DISTINCT C1.ToLoc,
              (SELECT ME1.EquipmentNumber FROM MajorEquipment ME1 WHERE C1.ToLoc = ME1.MEId) AS EquipmentNumber
       FROM MajorEquipment ME1 INNER JOIN
            CableId C1
            ON C.FromLoc = ME1.MEId
       WHERE C1.FromLoc = (SELECT ME1.MEId FROM MajorEquipment ME1 WHERE ME1.EquipmentNumber = '613-MCC-050')
      ) UNION
      (SELECT DISTINCT C2.FromLoc,
              (SELECT ME2.EquipmentNumber FROM MajorEquipment ME2 WHERE C2.FromLoc = ME2.MEId) AS EquipmentNumber
       FROM MajorEquipment ME2 INNER JOIN
            CableId C2
            ON C.FromLoc = ME2.MEId
       WHERE C2.ToLoc = (SELECT ME2.MEId FROM MajorEquipment ME2 WHERE ME2.EquipmentNumber = '613-MCC-050')
      )
     ) t;

(说实话,我总是这样编写查询,所以我可以想象不需要额外的括号。)

此外,select unique 也是不必要的。 union 无论如何都会删除重复项。

您还可以通过删除开头的 SELECT * FROM 来修复原始查询。

关于mysql - 每个派生表都必须有自己的别名 - *每个*派生表还是仅在每个查询中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29202468/

相关文章:

Mysql选择两个STRING之间的数据不是整数

Python/MySqlDB - 使用 raw_input 查询数据库并打印结果

mysql - 如何从表一中选择一列,同时传递表二中的列值?

mysql - 简单的 SQL 案例问题——当 NULL 时返回 0

asp.net - 将表字段名称作为字符串获取

python - MySql/Python 中的混合列求和

mysql - 删除 NOT IN 与 NOT EXISTS 的差异

MySQL DATE_FORMAT 反转?

mysql - SQL 从两个表中选择

mysql - 如何将 DATETIME 转换为 unix 时间戳(并正确处理负日期)?