这应该是程序员经常遇到的问题,但是我从来没有尝试过用这种方式来解决问题。
也就是说,我会解释。说,我需要像这样从表Zoo获取值:
@"SELECT z.predator, z.prey FROM Zoo AS z WHERE z.preyType=@carnivore"
现在,我可以将所有值都添加到列表中。我需要在网格中显示该查询的详细信息。现在已经有了z.predator和z.prey值(它们是时间上的整数,即它们各自的ID),我需要填充其有意义的值以将其显示给最终用户(我不能仅仅显示其ID)。所以现在我可能会做这样的事情:
foreach (Zoo z in lstZoo) { Animal predator = GetFromAnimalTable(z.Predator) Animal prey = GetFromAnimalTable(z.Prey) }
这会使程序变慢。我可以一口气查询所有详细信息吗?像这样的东西:
SELECT (SELECT * FROM ANIMAL WHERE id=z.predator), (SELECT * FROM ANIMAL WHERE id=z.prey) FROM Zoo AS z WHERE z.preyType=@carnivore
如果我可以将值读取到一个新的更大的对象?还是这被认为是不好的做法?
更新: 这是标准做法吗?还是建议像我首先说的那样单独填充?
更新2 :我似乎犯了一个可怕的错误,就是没有完全按照我的需要发布查询。我以为我可以从这里调整答案以满足我的要求,因为使用Access查询的括号构造不可以。
这是我的实际查询结果:
SELECT z.predator, p.lifeSpan, z.prey FROM Zoo AS z INNER JOIN Plants AS p ON p.parent_id=z.id WHERE z.preyType=@carnivore
实际上,我已经在另一个表中进行了INNER JOIN查询。现在,我需要获取(SELECT)满足INNER JOIN和WHERE条件的z.predator值(及其来自Animals表的对应值),p.lifeSpan,z.prey(及其对应的Animal表的值)。
伪代码如下所示:
SELECT (SELECT * FROM ANIMAL WHERE id=z.predator), p.lifeSpan, (SELECT * FROM ANIMAL WHERE id=z.prey) FROM Zoo AS z INNER JOIN Plants AS p ON p.parent_id=z.id WHERE z.preyType=@carnivore
从这里的答案中扩展我的要求应该很容易,但是到目前为止没有成功。我试过了:
SELECT a1.*, p.lifeSpan, a2.* FROM Zoo AS z INNER JOIN Plants AS p ON p.parent_id=z.id INNER JOIN Animal AS a1 ON (a1.id=z.predator) INNER JOIN Animal AS a2 ON (a2.id=z.prey) WHERE z.preyType=@carnivore
以及带有或不带有括号的此版本的许多变体。如何正确构造以上查询?
看来这是您最近的查询尝试:
SELECT a1.*, p.lifeSpan, a2.* FROM Zoo AS z INNER JOIN Plants AS p ON p.parent_id=z.id INNER JOIN Animal AS a1 ON (a1.id=z.predator) INNER JOIN Animal AS a2 ON (a2.id=z.prey)"; WHERE z.preyType=@carnivore
从语句内部丢弃分号。也放弃双引号。
为了简化SQL,暂时不包括WHERE子句。
然后,您应该可以更好地解决Access的db引擎多次联接所需的括号问题。
SELECT a1.*, p.lifeSpan, a2.* FROM ((Zoo AS z INNER JOIN Plants AS p ON p.parent_id=z.id) INNER JOIN Animal AS a1 ON a1.id=z.predator) INNER JOIN Animal AS a2 ON a2.id=z.prey
注意,我丢弃了那些用ON表达式括起来的括号。简单的ON表达式不需要它们。如果您有一个用于ON的复合表达式,则需要这样的括号:
ON (p.parent_id=z.id AND p.foo = z.bar)
我建议的示例查询对我来说看起来是正确的。(如果它对您有用,请再次添加您的WHERE子句。)但是,由于我使用Access的查询设计器来设置联接,因此我并没有特别注意括号的位置…并且它添加了db引擎所需的括号。 。
我敦促您也这样做。如果您使用的是来自Dot.Net的Access数据库,而没有安装Access副本,那么您确实应该获得一个副本。尝试在没有该数据库的本机开发工具的情况下使用数据库是一个不合理的挑战……有点像在戴手套的时候尝试打字。