我在这里有这个查询:
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'));
如您所见,我已将每个查询中引用的表指定为 C1
和 C2
以及 ME1
和 ME2
,但我仍然收到错误:
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/