【发布时间】:2016-03-04 20:48:08
【问题描述】:
我需要加入 3 个具有相同名称的列的表,例如 id 和一些外键列。
我进行了一个选择查询,结果仅带有表名。如何在我的查询中获得类似“dbname”。“columnname”的结果,以便我可以识别每个列来自哪个表,而不必指定查询中的每个列(仅使用 *)?
注意:我将 Delphi 与 ZeosLib 一起使用,因此使用这些工具的解决方案也可以。但我更喜欢在数据库中设置它。
【问题讨论】:
-
一点点调查将揭示大量避免将
SELECT *用于临时调查查询以外的任何事情的原因。最重要的是,它们在许多明显甚至一些非常微妙的方面都是严重的性能杀手。但除此之外,您现在通过懒惰地使用SELECT *节省的几分钟意味着未来的维护会受到阻碍,试图准确破译语句打算返回的数据。固执地坚持你希望找到一个使用众所周知的不良做法的“解决方案”可能不是一个好主意。 ;) -
附带说明,返回
TableName.ColumnName的内容在某些情况下将无用。考虑自联接,例如:SELECT e.EmpId, e.Name, m.Name AS ManagerName FROM Employees e LEFT OUTER JOIN Employees m ON m.EmpId = e.ManagerId。所以我强烈建议不要寻找一个银弹的坏主意:简单地明确列出列并适当地给它们起别名。 -
停止使用
SELECT *编写查询,您不会遇到任何问题。没有理由使用SELECT *,除了让你的代码在未来更难维护和极度懒惰之外。如果指定表和列,则可以根据需要使用别名来确定该列来自哪个表,而不必浪费时间问这样的问题。使用SELECT *的唯一原因是如果您不知道数据库中列的名称,在这种情况下您不能进行 JOIN。 -
这个问题的正确答案将是处理别人写得不好的 SQL 的主要武器:( 这个问题没有赞成票,但反对票。+1