Delphi 7更新联接表

Delphi 7更新联接表,delphi,join,delphi-7,firebird,firebird1.5,Delphi,Join,Delphi 7,Firebird,Firebird1.5,我正在使用Delphi7和Firebird数据库。我使用TIBDatabase、TIBTransaction、TIBQuery、TIBDataSet和DBGrid来建立连接,并为使用表提供用户界面。在我的数据库中有两个表: Ships fields Id integer Name varchar(20) Type_Id(Fk) integer Longth integer Ship_types fields Id(Pk) integer Ship_type varchar(10) 所以我通过

我正在使用Delphi7和Firebird数据库。我使用TIBDatabase、TIBTransaction、TIBQuery、TIBDataSet和DBGrid来建立连接,并为使用表提供用户界面。在我的数据库中有两个表:

Ships
fields
Id integer
Name varchar(20)
Type_Id(Fk) integer
Longth integer

Ship_types
fields
Id(Pk) integer
Ship_type varchar(10)
所以我通过“join”查询得到的结果数据集有这样的字段

Name
Type
Longth
Type是Ship_types表中的Ship_Type字段,通过Type_Id外键通过查询从Ships表连接到此表

数据显示正确

然后我需要直接通过DBGrid编辑数据。为此,我使用TIBUpdateSQL组件。对于显示类型(查找)字段,我选择了DBGrid.Columns.PickList属性

所以我的问题是如何让TIBUpdateSQL使用这种类型的字段?因为我知道如果它是没有外键的单表,我必须将update语句写入update组件的ModifySQL属性。但我和fk字段有什么关系?我可以在UpdateSQL组件中编写update join语句吗?或者,如果不可以,我还可以用什么方法来编写

我不需要更新两个表,我只需要更新Ships表,但是在显示数据集中有varchar(word representation)字段,在更新数据集中它必须是整数(对应的id)以适应表结构


TIBUpdateSQL中的编辑器不是我的解决方案,因为我正在运行时将查询分配给TIBQuery。

您不能使用select with JOIN更新表,只能使用SUBSELECT

子选择示例:

SELECT TABLE_NAME.*
     , (SELECT TABLE_NAME2.NAME FROM TABLE_NAME2 WHERE TABLE_NAME2.ID = TABLE_NAME.ID)
FROM TABLE_NAME

其实这不是火鸟的问题,而是积垢的设计。但答案是直接在DBGrid中使用DBLookupFields(而不是PickList)来选择船舶类型。