当前位置: 首页 > 面试题库 >

如何通过单个查询从两个表中填充两个对象?

袁鸿畅
2023-03-14
问题内容

这应该是程序员经常遇到的问题,但是我从来没有尝试过用这种方式来解决问题。

也就是说,我会解释。说,我需要像这样从表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副本,那么您确实应该获得一个副本。尝试在没有该数据库的本机开发工具的情况下使用数据库是一个不合理的挑战……有点像在戴手套的时候尝试打字。



 类似资料:
  • 我有以下表格: 表名称 -----| 表字段 图书--------------------图书id、图书名称 作者 ---------- | author_id、author_name 图书作者-作者id,图书id 用户------------------用户id、用户名 注释----------注释id,注释 评论|用户|评论| id、用户id、图书id、日期 我需要显示书名,它的作者,以及为这

  • 我试图从python脚本中的两个列表创建一个简单的条形图。但是,当数据填充到plotly系统中时,不会显示任何图形。下面是我编写的代码、列表的内容以及Plotly生成的代码。也许这是一种在填充图之前需要以某种方式拆分列表的情况?请原谅,这是一个新手问题,我以前从未尝试过。如有任何想法,将不胜感激。 脚本代码: 列表内容: 由Ploly创建的代码:

  • 问题内容: 我在MySQL中有两个表 现在,如果我想从邮件表中删除就可以了。但是,当我通过messageid删除消息时,该记录仍然存在于usersmessage上,我必须立即从这两个表中删除。 我使用以下查询: 然后我测试 但是这两个查询并没有完成此任务。 问题答案: 您不能用分号分隔它们吗? 要么 只需如下使用

  • 我想在pyspark中以如下方式连接两个数据帧df1: df2 看起来像: 我想以这样的方式连接两个数据帧,使其看起来像: 我做了什么: 但是,不幸的是,这对我来说并不奏效。任何形式的帮助或暗示都将非常感谢。

  • 我需要连接来自两个不同表的数据,如下所示。仅使用一个sql查询就可以做到这一点吗?如果“key”和“name”在两个表上,那么它们是相同的。表1中的“状态”始终为“-”,表2中的“T”。此外,两个表上的“名称”和“comp”都匹配(例如:Name3-C和Name4-B)<我尝试过“联合”和“加入”,但还没有解决办法! 表1 表2 结果应该是。。。 提前谢谢!

  • 我有两个表与1:1的关系,我使用内容提供者和CursorLoader。 如何使连接查询与游标加载器一起工作?我可以用内容提供程序中的rawSql来黑它,但如何在游标加载器构造函数中做就不是我能做到的了。 多谢!