这应该是程序员经常遇到的事情,但我从来没有尝试过这样处理。
也就是说,我会解释一下。比如说,我需要从表 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
如果我可以将值读取到新的更大对象中?或者这被认为是一种不好的做法?
UPDATE:这样做是标准做法吗?还是建议像我首先所说的那样单独填充?
UPDATE 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
还有许多带括号和不带括号的变体。如何正确构造上述查询?