SQLite内部联接问题
本文关键字:问题 内部 SQLite | 更新日期: 2023-09-27 17:58:46
我有两个表有一些奇怪的联接行为。以下是一个包含数据的简要模式:
CREATE TABLE object(vnum INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE object_affect(vnum INTEGER, apply_id INTEGER, modifier INTEGER);
object
vnum name
10404 Test Item
object_affect
vnum apply_id modifier
10404 1 4
10404 5 2
10404 12 6
如果我运行下面的查询,我应该返回3行,但它只返回1行。
select * from object o
inner join object_affect oa on oa.vnum = o.vnum
where o.vnum = 10404
如果我将查询更改为这个(将*更改为oa.vnum)..它将返回3行:
select oa.vnum from object o
inner join object_affect oa on oa.vnum = o.vnum
where o.vnum = 10404
此外,如果我从对象表的vnum字段中删除createtable语句中的"PRIMARY KEY"标志,则只返回一个1的第一个查询将正确返回所有3个连接行。
导致第一个查询没有返回3行联接数据的原因是什么?
3.5年后,我再次遇到了这种情况。我想分享解决方案。这种情况下的想法是,DataTable用于显示对某种控件、DataGrid等的查询结果。因此,它不需要DataTable试图从数据库中推断出的关于唯一键等的约束。没有什么好方法可以禁用我自己发现的对DataTable的约束,但您可以将其与DataSet耦合,然后就可以做到这一点。这个片段(假设SqliteCommand已经设置好)可以工作:
using (var dr = cmd.ExecuteReader())
{
var dt = new DataTable();
using (var ds = new DataSet() { EnforceConstraints = false })
{
ds.Tables.Add(dt);
dt.BeginLoadData();
dt.Load(dr);
dt.EndLoadData();
ds.Tables.Remove(dt);
}
}
基本上,我们临时使用数据集,然后丢弃它(从数据集中删除它很重要,这样数据集就可以被丢弃并进行垃圾收集)。然后,您可以保留DataTable并将其持久化以将其绑定到控件。