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行联接数据的原因是什么?

SQLite内部联接问题

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并将其持久化以将其绑定到控件。