FireDac 添加下划线 1 以区分具有相同名称的 2 个列名称

Posted

技术标签:

【中文标题】FireDac 添加下划线 1 以区分具有相同名称的 2 个列名称【英文标题】:FireDac adding underscore 1 to differentiate between 2 column names with the same name 【发布时间】:2016-11-01 10:25:13 【问题描述】:

我有一个连接 2 个表的选择,因此这些表中存在具有相似名称的列,所以现在在检索结果时 FireDac 在第二个列名称中添加下划线 1 以区分 2

Select * from Table1 inner join Table2 on 
Table1.id = Table2.id

当从具有相似名称的字段中获取记录时,我必须这样做......

Dataset.FieldByName('Name').asInteger
Dataset.FieldByName('Name_1').asInteger

我想知道是否有将_1更改为其他内容的设置,我想更改此设置的原因是我们曾经使用只添加了1的Interbase。

【问题讨论】:

【参考方案1】:

我不知道这种配置。我能想到的唯一选择是不要使用SELECT *,而是选择您实际需要的列,并为相同的列名使用别名,例如

SELECT Table1.Name, Table2.Name AS Name1, ... from Table1 inner join Table2 on 
Table1.id = Table2.id

或者,如果您需要来自Table1 的所有列并且您必须使用SELECT *,您可以使用:

SELECT Table1.*, Table2.Name AS Name1, ...

另请参阅:Why is “Select * from table” considered bad practice

【讨论】:

这是我实际上试图避免的,因为我需要很多字段 @Fero68,我确实意识到了这一点。但我没有看到任何其他选择。 AFAIK,您想要的无法完成。【参考方案2】:

不要使用select * from。命名您要获取的列,为它们定义别名并使用它们的表名(或它们的别名)来创建唯一名称。

select t1.Name as Name1, t2.Name as Name2 from Table1 t1 inner join Table2 t2 on t1.Name = t2.Name

您现在可以通过这种方式获取它们的值

Dataset.FieldByName('Name1').asInteger;

【讨论】:

我只是想知道。像“t1.Name”这样的寻址字段是 FireDac 的功能吗? 你确定这可以在 FireDac 中工作吗?这不适用于 ADO,并且具有与 OP 描述的相同的行为。 @kobik。完全正确 - 这就是我第一次检查的内容:) 我实际上是在尽量避免使用别名 @Fero68 为什么?别名可帮助您解决问题。有充分的理由使用它们。否则,您需要在数据库中以不同的方式命名列

以上是关于FireDac 添加下划线 1 以区分具有相同名称的 2 个列名称的主要内容,如果未能解决你的问题,请参考以下文章

Delphi,如何在两个不同的包中安装具有相同名称的组件

如何区分具有相同名称的多个进程并杀死所有在 C# 中以我的 USERNAME 运行的进程?

是否有理由不在 Core Data 实体中使用相同的属性名称?

根据文件夹名称批量合并文件夹

PHP 变量

JS规则 给变量取个名字(变量命名) 必须以字母下划线或美元符号开头;区分大小写;不允许使用JS关键字或保留字