SQL查询的伪代码

SQL查询的伪代码,sql,database,Sql,Database,嗨伙计们我有个问题 假设表fooa int、b int和bara int、b int,并假设您得到一个流“TableReader”,该流从具有以下方法的表中读取行: 如果有下一行,tr.next返回流中“row”类型的下一行;如果没有更多行,则返回null。 假设可以使用行[columnName]访问列。例如,要从foo中读取行,必须执行以下操作: foo_stream=TableReader'foo'; row=foo_stream.next 行['a']将返回列a的值,行['b']将返回列b

嗨伙计们我有个问题

假设表fooa int、b int和bara int、b int,并假设您得到一个流“TableReader”,该流从具有以下方法的表中读取行: 如果有下一行,tr.next返回流中“row”类型的下一行;如果没有更多行,则返回null。 假设可以使用行[columnName]访问列。例如,要从foo中读取行,必须执行以下操作: foo_stream=TableReader'foo'; row=foo_stream.next

行['a']将返回列a的值,行['b']将返回列b的值

编写伪代码以计算以下SQL查询的结果,该查询应返回行列表: 选择foo.a、foo.b、bar.a、bar.b 来自福巴 其中foo.a=bar.a
foo.b可能是这样的:

Foo_stream = TableReader(‘foo’);
Foo_row = Foo_stream.next();
Foo_hash = New HashSet<Foo_row[a].typeof, Foo_row.typeof>();

Do
{
    if (Foo_row[b] <= 100)
    {
        Foo_hash.Add(Foo_row[a], Foo_row);
    }
    if (!foo_stream.next())  { Foo_row = Foo_stream.next(); }
} While(foo_stream.next())

Bar_stream = tableReader(‘bar’);

While(bar_stream.next())
{
    Bar_row = Bar_stream.next();
    if (Foo_hash.Exists(Bar_row[a]))
    {
        Foo_row = Foo_hash(Bar_row[a]);
        print foo_row[a],foo_row[b], bar_row[a],bar_row[b];
    }
}
这称为HashMap方法,并且处于启用状态,尽管它使用了相对较大的内存量

还有MergeSort方法,它是ONlogN,除非流已经在[a]上排序。它需要的内存比HashMap方法少一些


最后是您使用的方法,称为嵌套循环方法,正如您所说,它位于^2上,但其优点是需要很少的内存。

这就是为什么实际数据库有索引,它们不是按顺序访问的。这个问题似乎与主题无关,因为它是关于理论数据库的,不实用的编程。它可能属于cs.stackexchange.com。您的代码中也存在一些逻辑问题:1,在您使用时。接下来,在您的while条件下,您每读取一行就跳过一行,2,为什么您的2个读取操作在内部while循环中?这是真的,但是,有人能帮我处理一些其他psudo代码吗?这些代码没有两个while,这样复杂性就从On2降低到On或nlogn。我将两个读取操作都保留在second while中,这样它就位于块的本地,如果我将first read in保持在first,那么我认为它将无法从second while块的内部访问。如果我错了,请纠正我谢谢你,先生,这个有帮助。
Foo_stream = TableReader(‘foo’);
Foo_row = Foo_stream.next();
Foo_hash = New HashSet<Foo_row[a].typeof, Foo_row.typeof>();

Do
{
    if (Foo_row[b] <= 100)
    {
        Foo_hash.Add(Foo_row[a], Foo_row);
    }
    if (!foo_stream.next())  { Foo_row = Foo_stream.next(); }
} While(foo_stream.next())

Bar_stream = tableReader(‘bar’);

While(bar_stream.next())
{
    Bar_row = Bar_stream.next();
    if (Foo_hash.Exists(Bar_row[a]))
    {
        Foo_row = Foo_hash(Bar_row[a]);
        print foo_row[a],foo_row[b], bar_row[a],bar_row[b];
    }
}