如何使用单个查询 (SELECT) 从两个表中填充两个对象?

2023-12-06

这应该是程序员经常遇到的事情,但我从来没有尝试过这样处理。

也就是说,我会解释一下。比如说,我需要从表 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

还有许多带括号和不带括号的变体。如何正确构造上述查询?


SELECT pred.col1 AS PredCol1, ..., pred.colx AS PredColx, 
       prey.col1 AS PreyCol1, ..., prey.colx AS PreyColx
    FROM Zoo z
        INNER JOIN Animal pred
            ON z.predator = pred.id
        INNER JOIN Animal prey
            ON z.prey = prey.id
    WHERE z.preyType = @carnivore

或者,您可能想要这样的东西。

SELECT 'Predator' AS AnimalType, pred.*
    FROM Zoo z
        INNER JOIN Animal pred
            ON z.predator = pred.id
    WHERE z.preyType = @carnivore
UNION ALL
SELECT 'Prey' AS AnimalType, prey.*
    FROM Zoo z
        INNER JOIN Animal prey
            ON z.prey = prey.id
    WHERE z.preyType = @carnivore
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用单个查询 (SELECT) 从两个表中填充两个对象? 的相关文章

  • 如何在 SQL 中存储目标(例如 RPG Quest)

    今天有人问我他们应该如何将任务目标存储在 SQL 数据库中 在这种情况下 请考虑角色扮演游戏 目标可能包括以下一些内容 发现 地点 杀死 n MOB 类型 获取 对象 的 n 个 实现 技能组 中的 技能 你在角色扮演游戏中获得的所有其他东
  • 列是存在的,但是当我尝试删除它时,它说 MYSQL 中没有列? **错误代码:1091。无法删除...**

    我尝试运行以下查询 ALTER TABLE ORDER DETAIL DROP foreign key USER ID It says Error Code 1091 Can t DROP USER ID check that column
  • 有很多数据库视图可以吗?

    我很少 每月 每季度 使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告 在我不读取这些视图的所有时间里 这些视图是否会浪费 CPU 周期和 RAM 因为我很少从视图中读取数
  • mysql 在 sum() 函数上使用 concat,例如 concat(sum(col1),"%")

    我正在尝试合并多个查询 但其中一个查询使用 sum 当我尝试在此列上应用 concat 时 我得到不需要的 blob 结果 我如何在聚合列上应用 concat 和 union 我期待这个结果 SELECT row 1 col1 UNION
  • PostgreSQL 如何创建数据库或模式的副本?

    有没有一种简单的方法可以在 PostgreSQL 8 1 中创建数据库或模式的副本 我正在测试一些软件 它对数据库中的特定模式进行大量更新 我想复制它 以便我可以与原始版本进行一些比较 如果它位于同一服务器上 则只需使用带有 TEMPLAT
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • 如何查找列中未使用的ID? [复制]

    这个问题在这里已经有答案了 可能的重复 SQL查询查找丢失的序列号 https stackoverflow com questions 1057389 sql query to find missing sequence numbers 我
  • VBA 访问:从另一个表单的代码刷新一个表单

    编辑 没关系有人帮助了我 form name recalc 或 form name refresh form main recalc 我有两种形式 主要 详细信息 在 主 表单中 我有一个在对话框中打开 详细信息 的按钮 问题是我在 详细信
  • 交换 ms-sql 表

    我想以尽可能最好的方式交换到桌子 我有一个 IpToCountry 表 并根据导入的外部 CSV 文件每周创建一个新表 我发现进行切换的最快方法是执行以下操作 sp rename IpToCountry IpToCountryOld go
  • SQLite 自然连接损坏?

    我刚刚开始了解 NATURAL JOIN 而 SQLite 的行为并不像我预期的那样 SELECT FROM r1 NATURAL JOIN r2 NATURAL JOIN r3 and SELECT FROM r1 NATURAL JOI
  • 在SQL中,如何通过查找与某一列相等的所有行来更新表的每一行,然后将另一列设置为彼此相等

    所以基本上这就是伪代码 但我不知道如何在 SQL 中执行此操作 请帮忙 for each row in table1 loop through each row in table 2 if table1 s row column 1 tab
  • 无重复组合的交叉连接

    我知道这个问题与这个问题非常相似 对称交叉连接 https stackoverflow com questions 12490244 symmetric cross join还有这个 sql 中交叉连接的组合 不是排列 https stac
  • 如何从 SQL Server 中的 SELECT 进行更新?

    In SQL服务器 可以将行插入到带有INSERT SELECT陈述 INSERT INTO Table col1 col2 col3 SELECT col1 col2 col3 FROM other table WHERE sql coo
  • OpenArgs 为空问题

    我正在使用OpenArgs使用时发送值的参数DoCmd OpenForm DoCmd OpenForm frmSetOther acNormal acFormAdd acDialog value 然后我用Me OpenArgs在打开的表格内
  • 数据库级别的别名列名 [MySQL]

    别名 可能是错误的词 因为它是在将列 表名称作为查询中的其他名称引用的上下文中使用的 我感兴趣的是是否有一种方法可以在数据库中为列指定两个名称 如果我要打印这样的表格 它看起来会是这样的 mysql gt SELECT FROM User
  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • Postgres 中 -Infinity 和 Infinity 的适当值

    在一种情况下 我们必须在 Postgres DB 中存储 无穷大和 无穷大的值 应该考虑什么合适的值 如果没有 请建议最合适的替代方案 你实际上可以使用 infinity and infinity for FLOAT4 and FLOAT8
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 如何在Oracle中从表中选择列,*?

    我正在创建很多脚本 有时为了检查表是否根据我的需要进行更新 我会即时编写几个 SELECT 语句 在 SQL SERVER 中你可以这样写 SELECT Column1 FROM MY TABLE 出于可见性原因 这很有用 但是这似乎在 O
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字

随机推荐

  • 将 ArrayList 制作为 JTable

    我有一个 ArrayList
  • 如何从源代码为任何应用程序创建数据流图 (DFG/SDFG)

    我做了很多研究来弄清楚如何从源代码为应用程序创建 DFG DFG 可在线用于某些应用程序 例如 MP3 解码器 JPEG 压缩和 H 263 解码器 我一直无法弄清楚如何从源代码为 HEVC 等应用程序创建 DFG 是否有任何工具可以立即为
  • Datastax DSE 5.1 搜索是否支持 facet.pivot 中使用的 Solr 本地参数

    据我了解 DSE 5 1 运行 Solr 6 0 版本 我正在尝试使用 Solr 本地参数来使用 facet pivot 功能 但它似乎不起作用 我的数据如下简单4个字段 我需要的是按名称字段对结果进行分组 以便获得每年的总和 钱 我相信带
  • Android 上的 OpenGL 深度缓冲区

    我目前正在 Android 2 1 上学习 OpenGL ES 编程 我从强制性的旋转立方体开始 它旋转得很好 但我无法让深度缓冲区工作 多边形始终按照 GL 命令渲染它们的顺序显示 我在 GL 初始化期间执行此操作 gl glClearC
  • 安装Maven 3后mvn无法识别

    我的 Maven 3 安装有一些问题 我已经下载了maven 3 0 3并将其解压到一个文件夹中 我设置了以下环境变量 M2 HOME C a few folders apache maven 3 0 3 M2 M2 HOME bin JA
  • 更改 JtextPane 中的鼠标指针

    我有一个JTextPane其内容类型为文本 纯文本 我为此设置了一些文本JTextPane它包含一些显示的文本URLs 当我将鼠标指向该文本时 我想仅将鼠标指针更改为手形指针 这个功能可以实现吗 注 我有以下内容JTextPane as t
  • 对于 DynamicComponentLoader,@ContentChild 为 null

    我有一个可在许多页面上使用的侧面导航组件 这不是单页网络应用程序 它动态加载到切换菜单的父组件上 ContentChild 用于获取子组件的句柄 以便可以通过设置 input overrideHidden 来切换子组件 问题是 Conten
  • Ruby/Watir:firefox 无头

    根据这个 https developer mozilla org en US Firefox Headless modefirefox 57 能够以无头模式运行 我尝试将它与此一起使用 omg3r Watir Browser new fir
  • 堆栈跟踪是如何生成的?

    程序中没有任何一个方法 知道 它在堆栈上的位置 它所知道的只是它自己的小工作 它完成了它并返回 那么 当抛出异常并打印堆栈跟踪时 这是从哪里来的呢 JVM 中是否隐式有一个单独的线程与每个应用程序一起运行来监视程序的状态 或者 JVM 本身
  • Google表格:删除包含指定数据的行

    我是 Java 脚本和 Google Apps 脚本的新手 所以如果这个问题已经得到解答 我很抱歉 在从事这个项目的最后几个月里 我无法找到我想要的东西 我正在这里编写脚本的变体 如果在单元格中找到特定 单词 则删除 Google 表格中的
  • 在类型转换中,类型“List”不是类型“List”的子类型

    运行后飞镖迁移 应用空安全性 该错误在我的代码中弹出 我认为这是导致代码块的错误 LayoutBuilder builder context cons return GestureDetector child new Stack child
  • 由于谷歌自动服务处理器,无法编译我的 javafx 和 selenium 项目(“无法获取公共无参数构造函数”)

    我正在尝试使用 Maven 编译我的 Instagram 机器人 它使用javafx作为接口 使用selenium作为自动化 我已经被这个错误困扰了很长时间 当我尝试做的时候mvn clean javafx jlink它向我显示了这个错误
  • MYSQL 无法从 PHP 接收数据

    我正在尝试将数据从输入发送到我的 sql 数据库 这是它尝试将信息发送到数据库的编码 它不会出现在数据库中 编码有什么问题
  • 如何将密码从md5转换为laravel加密方法

    我想将现有项目重新开发为 laravel 在我的旧系统中 我将密码存储到 md5 中 现在我如何根据现有用户的 laravel 哈希方法将其转换 有什么直接的方法可以做到吗 有什么直接的方法可以做到吗 不 没有直接的方法 但你可以通过重写来
  • 禁用 CMake 选项没有效果

    我正在准备一个应用程序 它应该在有或没有 GUI 的情况下工作 所以我在 CMakeLists txt 中使用命令 option NEED GUI Include Qt support OFF and if NEED GUI message
  • R 中给定出生日期和任意日期的有效且准确的年龄计算(以年、月或周为单位)

    我面临着计算给定出生日期和任意日期的年龄 以年 月或周为单位 的常见任务 问题是 我经常必须对许多记录 gt 3 亿 执行此操作 因此性能是这里的一个关键问题 在 SO 和 Google 中快速搜索后 我找到了 3 个替代方案 常见的算术过
  • Python 中 (1,) 是什么意思?

    我查看了类似的问题 但没有在任何地方找到这个主题 我想知道元组有什么作用 1 在 Python 中是什么意思 From https wiki python org moin TupleSyntax 单元素元组 单元素元组如下所示 1 这里的
  • 索尼,相机远程API

    我有一台 Sony Alpha 5000 ILCE 5000 相机 我一直在用它开发一个网络项目 我通过 wifi 使用 JSON 集成该相机没有任何问题 但我不想依赖 wifi 相机 我的Web项目是否可以像远程相机控制程序一样通过USB
  • 如何防止 vim autocmd 在命令行窗口中运行?

    当我离开插入模式时 我使用自动命令关闭预览窗口 如中所述这个答案 但是当我在命令行窗口中时 q 我得到一个错误 E11 Invalid in the command line window
  • 如何使用单个查询 (SELECT) 从两个表中填充两个对象?

    这应该是程序员经常遇到的事情 但我从来没有尝试过这样处理 也就是说 我会解释一下 比如说 我需要从表 Zoo 中获取值 如下所示 SELECT z predator z prey FROM Zoo AS z WHERE z preyType