3

我在数据库中有这些表:

  • 实体(ID、名称、已删除)
  • 实体别名(实体 ID,别名 ID)
  • 别名(ID,名称)

此查询工作正常,但由于 UNION 很慢,请注意 entity.name 如何与 aliases.name 交换并移至最后一列:

SELECT entities.id, entities.name, entities.deleted, NULL AS main_name
FROM entities
UNION
SELECT entities.id, aliases.name, entities.deleted, entities.name AS main_name
FROM entities
JOIN entities_aliases ON entities_aliases.entity_id = entities.id
JOIN aliases ON entities_aliases.alias_id = aliases.id
ORDER BY name

这种交换对我来说非常重要,我无法删除它,但是随着数据库在宽度(更多字段和链接)和深度(更多记录)方面的发展,UNION 会变得越来越慢。我怎样才能摆脱 UNION?

补充: 我需要的输出。例如,我们有实体 1-AAA 和他的别名 1-BBB 和 2-CCC。输出应该是:

  • AAA
  • BBB (AAA)
  • CCC (AAA)
4

2 回答 2

1

我认为您可以使用 LEFT JOINS 和一些 IF 来实现它:

SELECT e.id, IFNULL( a.name, e.name ) AS name, e.deleted, IF( a.name IS NULL, NULL, e.name ) AS main_name
FROM entities AS e
LEFT JOIN entities_aliases AS ea ON e.id = ea.entity_id
LEFT JOIN aliases AS a ON ea.alias_id = a.id;

如果我明白你想要什么,如果没有别名(按此顺序),你希望“name”是别名或实体名,当你没有别名时 main_name 为空,当你没有别名时实体名你确实有别名。我希望它有帮助!

于 2012-05-20T21:32:14.813 回答
0

以下查询仅使用 UNION ALL 而不是 UNION:

SELECT *
FROM ((SELECT entities.id, entities.name, entities.deleted, NULL AS main_name
       FROM entities
      ) union all
      (SELECT entities.id, aliases.name, entities.deleted, entities.name AS main_name
       FROM entities e join
            entities_aliases ea
            ON ea.entity_id = e.id JOIN
            aliases a
            ON ea.alias_id = a.id
     )
    ) e
ORDER BY name

UNION ALL 从查询中删除“不同的”进程。

良好的格式*我主观地定义为我做事的方式)使我更容易看到查询。还:

  1. 确保entities.entity_id 是实体的主键。
  2. 确保 alias.id 是别名的主键。

您没有进行任何过滤,因此 entity_aliases 上的外键关系是可选的。

于 2012-05-20T20:37:19.237 回答