我有两个表有一些奇怪的连接行为。这是一个包含数据的简要模式:
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
另外,如果我删除" PRIMARY KEY"在对象表的vnum字段的create table语句中标记第一个只返回1的查询1正确返回所有3个连接的行。
我缺少什么导致第一个查询不返回3行连接数据?
答案 0 :(得分:0)
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);
}
}
基本上,我们临时使用DataSet然后将其丢弃(将其从DataSet中删除很重要,这样DataSet才能进行处理并进行垃圾回收)。然后,您可以保留DataTable并将其持久化以将其绑定到控件。