【问题标题】:FireDac adding underscore 1 to differentiate between 2 column names with the same nameFireDac 添加下划线 1 以区分具有相同名称的 2 个列名称
【发布时间】: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。

【问题讨论】:

    标签: sql delphi firedac


    【解决方案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 为什么?别名可帮助您解决问题。有充分的理由使用它们。否则,您需要在数据库中以不同的方式命名列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多