使用ADO删除联接表中的行
时间:2020-03-06 14:22:38 来源:igfitidea点击:
现在,我在另一个论坛上看到了这个问题,但没有一个可接受的答案。
假设我有两个表,Groups表和Elements表。这些表没有定义的关系。 Elements表具有一个IdGroup字段,该字段引用Groups表的IdGroup(PK)字段。
我通过ADO记录集使用以下查询来将表值填充到datagrid中:
SELECT Elements.*, Groups.GroupName FROM Elements INNER JOIN Groups ON Elements.IdGroup = Groups.IdGroup
从该网格中,我想按Delete键以删除元素。这是我的问题。当我使用DAO时,DAO Delete()函数仅删除Elements组中的记录。这是预期的行为。
当我更改为ADO时,Delete()函数删除了两个表,元素记录和元素所属的组中的记录!
有什么方法可以在ADO中重现DAO行为,而不必在表中定义关系?
注意:我知道还有其他选择(执行DELETE查询可以完成此工作)。只是向我展示一种在ADO中执行此操作的方法,或者说它无法完成。
解决方案
将查询重写为:
- 用由EXISTS组成的WHERE子句替换INNER JOIN;
- 在SELECT子句中使用子查询返回Groups.GroupName的值。
例子:
SELECT Elements.*, ( SELECT Groups.GroupName FROM Groups WHERE Elements.IdGroup = Groups.IdGroup ) FROM Elements WHERE EXISTS ( SELECT * FROM Groups WHERE Elements.IdGroup = Groups.IdGroup );
我已经使用SQL Server 2008进行了测试,并将ADO记录集设置为Microsoft OLEDB Datagrid Control(MSDATGRD.OCX)的DataSource属性,然后通过网格删除了行(我假设我们正在做类似的事情),并且该行的确是仅从表元素中删除(即,"组"中的行保持未删除状态)。
请注意,修改后的查询在获取行时可能会对性能产生负面影响。