【发布时间】:2021-09-30 11:14:04
【问题描述】:
我将带有 MS Access 基础的应用程序 (Delphi 10.3) 从 ADODB 迁移到 Firedac。
当某些 TField FieldName 名称复杂时,我遇到了问题:
简单示例:CREATE TABLE TEST ([SE_NAME] CHAR(3))
像SELECT * FROM TEST T1 LEFT JOIN TEST T2 ON T1.SE_NAME=T2.SE_NAME这样的查询
我希望 FieldNames :'T1.SE_NAME' 和 'T2.SE_NAME'(如 Access 2013 中)。
使用 ADODB TADOQuery :
var f: TField;
var s: string := '';
for f in Query.Fields do
s := s + f.FieldName + ' ;' ;
s 是 'T1.SE_NAME ;T2.SE_NAME ;' 好的。
使用 Firedac TFDQuery:
var f: TField;
var s: string := '';
for f in Query.Fields do
s := s + f.FieldName + ' ;' ;
s 是 'SE_NAME ;SE_NAME_1 ;':不正常:FireDac 更改了列名。
如何在不更改 SQL 查询的情况下(使用 Firedac 选项?)保留真实的列名(为了兼容需要)?
在 MSAccess (2013) 中,SELECT * FROM TEST T1 LEFT JOIN TEST T2 ON T1.SE_NAME=T2.SE_NAME 的结果是:
请注意:
- 我知道如何使用查询、别名...但我需要保留查询以保持兼容性。
- 查询只是示例(不是真正的查询)。
【问题讨论】:
-
在这种情况下,我使用别名:
SELECT T1.SE_NAME SE_NAME1, T2.SE_NAME SE_NAME2 FROM TEST T1 LEFT JOIN TEST T2 ON ...。 -
full syntax of aliases 是:
SELECT whatever AS alias, other AS newname... FROM table AS abbreviation, ...,就像您已经使用FROM test (AS) T1的缩写形式一样。 -
我不是 SQL 期望,但我知道 JOIN 是什么,但如果您只从 T1 中选择数据,为什么您希望 T2 中的任何字段出现在结果集中,因此在
Fields列表中? -
@RemyLebeau A
SELECT *将从查询的FROM部分涉及的所有表中获取所有字段。 -
您是否有很多查询要更改,您已经准备好因此花费 500 点而不是仅仅修复它们?不幸的是,您所要求的可能是不可能的。但是您可以直接查看 FireDAC 源代码来确定。