如何通过 JOIN 组合(合并)相似的列以删除 NULL

2024-04-23

问题简介:

我有一个名为“客户”的超类表和两个从客户继承的名为“个人”和“公司”的子表。因此,客户实体与“人”或“公司”具有一对一的关系。

(客户只能是“个人”或“公司”,但不能同时是两者)

如下所示:

Customer                    Person                      Company                
+-------+------+------+     +-------+------+------+     +-------+------+------+
|    cID|  col2|  col3|     |    cID| fname| sname|     |    cID|  name|  col3|
+-------+------+------+     +-------+------+------+     +-------+------+------+
|1      |?     |?     |     |1      |JJ    |AZ    |     |4      |ABCD  |?     |
+-------+------+------+     +-------+------+------+     +-------+------+------+
|2      |?     |?     |     |2      |CC    |LL    |     |5      |BCDE  |?     |
+-------+------+------+     +-------+------+------+     +-------+------+------+
|3      |?     |?     |     |3      |OO    |BB    |     |6      |CDEF  |?     |
+-------+------+------+     +-------+------+------+     +-------+------+------+
|4      |?     |?     |     |7      |JK    |NN    |     |8      |DEFG  |?     |
+-------+------+------+     +-------+------+------+     +-------+------+------+
|5      |?     |?     |     |9      |RR    |LW    |     |...    |EFGH  |?     |
+-------+------+------+     +-------+------+------+     +-------+------+------+
|6      |?     |?     |     |10     |GN    |QN    |     |...    |FGHI  |?     |
+-------+------+------+     +-------+------+------+     +-------+------+------+
|7      |?     |?     |     |...    |XC    |YU    |     |...    |GHIJ  |?     |
+-------+------+------+     +-------+------+------+     +-------+------+------+
|8      |?     |?     |
+-------+------+------+
|9      |?     |?     |
+-------+------+------+
|10     |?     |?     |
+-------+------+------+
|...    |?     |?     |
+-------+------+------+
  • Person 表将客户的全名存储在单独的名字和姓氏属性中。
  • 公司表将公司名称完全存储在一个字段中。

意图与尝试:

我想做的是查询数据库,以便我可以从客户表中选择 ID,加入个人和公司以检索名称属性。

以下是我尝试过的:

SELECT      tc."cust_id",
            CONCAT(tp."forename", ' ', tp."surname") AS "name",
            tcp."name"
FROM        "tbl_customer" AS tc
            LEFT JOIN "tbl_person" AS tp
                ON tc."cust_id" = tp."cust_id"
            LEFT JOIN "tbl_company" AS tcp
                ON tc."cust_id" = tcp."cust_id"

执行上面的 SQL 会得到以下结果,右边是我想要实现的结果:

Result                      Result          
+-------+------+------+     +-------+------+
|    cID|  name|  name|     |    cID|  name|
+-------+------+------+     +-------+------+
|1      |JJAZ  |null  |     |1      |JJAZ  |
+-------+------+------+     +-------+------+
|2      |CCLL  |null  |     |2      |CCLL  |
+-------+------+------+     +-------+------+
|3      |OOBB  |null  |     |3      |OOBB  |
+-------+------+------+     +-------+------+
|4      |null  |ABCD  |     |4      |ABCD  |
+-------+------+------+     +-------+------+
|5      |null  |BCDE  |     |5      |BCDE  |
+-------+------+------+     +-------+------+
|6      |null  |CDEF  |     |6      |CDEF  |
+-------+------+------+     +-------+------+
|7      |JKNN  |null  |     |7      |JKNN  |
+-------+------+------+     +-------+------+
|8      |null  |DEFG  |     |8      |DEFG  |
+-------+------+------+     +-------+------+
|9      |RRLW  |null  |     |9      |RRLW  |
+-------+------+------+     +-------+------+
|10     |GNQN  |null  |     |10     |GNQN  |
+-------+------+------+     +-------+------+
|...    |?     |?     |     |...    |?     |
+-------+------+------+     +-------+------+

描述:

如前所述,我试图将个人和公司的名称合并在同一列下。两个表上的标准 JOIN 将不起作用,因为它将返回 NULL 结果。由于 LEFT JOIN 的性质,预计会出现 NULL 值。这可以通过 SQL UNION 非常简单地解决,我知道解决方案,但是我正在寻找通过 JOIN 来替代 UNION 运算符的方法。

我是否可以执行 JOIN、分组/合并名称列?或者类似的东西?但不是一定要用SQL UNION吗?

Update:

两个答案均来自胡安·卡洛斯·奥罗佩萨 and Becuzz都同样可以接受。


COALESCE 听起来它会完全按照您的要求进行。 COALESCE 是一个返回其参数的第一个非 NULL 值的函数。

SELECT      tc."cid",
            COALESCE(tp.firstName||' '||tp.lastName, tcp.name) as "name"
FROM        "customers" AS tc
            LEFT JOIN "person" AS tp
                ON tc."cid" = tp."cid"
            LEFT JOIN "company" AS tcp
                ON tc."cid" = tcp."cid"

SQL小提琴 http://sqlfiddle.com/#!15/c3018/8

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 JOIN 组合(合并)相似的列以删除 NULL 的相关文章

  • 查询计算不同值的数量?

    我在 MS Access 2003 中有一个表 如下所示 url id example com red example com blue example com blue other com red other com orange mor
  • Case 表达式在 SQL 查询中无法正常工作

    我想连接列supplier使用逗号分隔符创建表并将其放入名为 contact 的别名字段中 我使用过检查空值的案例 假设如果contact number2则为空contact number3将在别名字段中 反之亦然 这是我的查询 SELEC
  • SQL SERVER 字符串中的掩码字符

    如何替换 SQL SERVER 中字符串中 x 和 y 字符之间的字符 例如 如果我有 TEST123456 最后有 TE 56 我不知道字符串有多长 但我知道我需要屏蔽字符串中 x 和 y 之间的字符 你可以使用REPLICATE htt
  • 查找某个字段发生更改时的开始日期和结束日期

    我在表中有这些数据 FIELD A FIELD B FIELD D 249052903 10 15 2011 N 249052903 11 15 2011 P VALUE CHANGED 249052903 12 15 2011 P 249
  • PostgreSQL 列“foo”不存在

    我有一个表 其中有 20 个整数列和 1 个名为 foo 的文本列 如果我运行查询 SELECT from table name where foo is NULL 我收到错误 ERROR column foo does not exist
  • MySQL 中复制一条记录

    我有一个表 我想复制表中的特定行 我知道这不是最好的方法 但我们正在寻找快速解决方案 这比我最初想象的要难 我需要做的就是将整个记录复制到 MySql 中自动增量表中的新记录 而不需要指定每个字段 这是因为该表将来可能会发生变化 并且可能会
  • SQL Server 中的循环行

    我有一个包含 2 列的 SQL Server 表 Code 和 CodeDesc 我想使用 T SQL 循环遍历行并打印 CodeDesc 的每个字符 怎么做 如果您确实想循环遍历行 则需要光标 CURSOR http msdn micro
  • ORA-01438: 值大于此列允许的指定精度

    有时我们会从合作伙伴的数据库中收到以下错误 i ORA 01438 value larger than specified precision allows for this column i 完整响应如下所示
  • 如何在JdbcTemplate中执行多批量删除?

    我想一次删除多个数据库条目 仅当 3 个字段匹配 此处 姓名 电子邮件 年龄 时 才应删除每个条目 如果我只想删除单个属性 我会选择 String sql DELETE FROM persons WHERE email IN JdbcTem
  • Windows 批处理文件中的 SQL 语句

    有没有办法让Windows批处理文件直接输入SQL语句而不需要调用脚本 我希望批处理文件登录SQL 然后直接输入语句 EDIT 我正在使用 Oracle v10g 对于单个命令 您可以使用以下技巧 echo select from dual
  • 将 DD-Mon-YYYY 转换为 DD/MM/YYYY

    我需要转换 dt of birth varchar 15 其格式为DD Mon YYYY to DD MM YYYY dt of birth在不同的表中指定 并且必须完成转换并将其存储在具有相同列名的另一个表中dt of birth Her
  • 什么时候空值在列中“安全”?

    设计数据库时是否存在允许列为空与 3nf 规范化的一般经验法则 我有一个表 其中的列主要由空值 85 组成 但表大小不超过 10K 记录 不是很大 它主要用于日志记录和记录保存 因此大多数事务将是插入和选择 而不是更新 我试图同时考虑性能和
  • SQL 数据范围最小值最大值类别

    我想确定 2 个类别的范围 A 类和 B 类 A 从 1 到 15 开始 B 从 16 到 31 开始 然后 A 再次从 32 到 40 开始 现在如果运行此查询 select min range max range from table
  • 如何提取 MySQL 日期中的月份和年份并进行比较?

    如何从 mySQL 日期中提取月份和日期并将其与另一个日期进行比较 我找到了 this MONTH 但它只获取月份 我寻找月份和年份 在Mysql Doku中 http dev mysql com doc refman 5 5 en dat
  • MySQL SUM 具有相同的 ID

    抱歉 这个真正简单的问题 我刚刚学习 PHP 和 MySQL 我已经在谷歌上搜索了一个多星期 但没有找到任何答案 我创建了一个简单的财务脚本 表格如下 table a aid value 1 100 2 50 3 150 table b b
  • 在sql server中透视固定的多列表

    我有一个需要为报告服务进行旋转的表格 DateCreated Rands Units Average Price Success Unique Users 2013 08 26 0 0 0 0 0 2013 08 27 0 0 0 0 0
  • Postgres 到 Ubuntu Docker 容器的链接不起作用

    编辑 我可以在没有任何我自己的自定义代码的情况下重现此内容 我刚刚创建了一个运行 Ubuntu 14 04 的新 Linode 映像 并按照以下步骤安装了 DockerDocker 的网站 https docs docker com ins
  • “date $1”参数化查询中的 PostgreSQL 语法错误

    尝试参数化我的 SQL 查询 使用 libpq 函数PQexec参数 http www postgresql org docs current static libpq exec html 我陷入了语法错误 SELECT date 1 错误
  • 错误:重复的键值违反了 postgreSQL 中的唯一约束

    我在更新表时遇到 postgresql 中的唯一约束问题 我有一个包含 3 列的表 并且对其中一列 internal state 有唯一约束 该表只有两列 internal state 的值为 1 0 更新查询是 UPDATE backfe
  • mysql 查询从给定的表结构创建 SEO 友好的 url

    我正在尝试使用下表创建 SEO 友好的 URL 类别表 http sqlfiddle com 2 c474a 4 页表 http sqlfiddle com 2 c474a 5 我正在尝试编写一个 mysql 查询 该查询将使用产生以下输出

随机推荐

  • jQuery 和使用速记设置 CSS

    来自 Pro PHP 和 jQuery 提示 返回的值是 CSS 简写属性 3 添加了一个 jQuery 的好处是能够使用 CSS 设置 CSS 属性 简写 它不适用于基本的 JavaScript 来自 jQuery API 参考 简写 C
  • 使用 sapply 时,我在 str2lang(x) 中收到错误: :1:31: 意外符号 1 ^

    当运行这段代码时 我会得到一个错误 genes lt colnames survdata c 1 3 univ formulas lt sapply genes function x as formula paste Surv OS sta
  • 如何在 Electron 桌面应用程序中使用 Google 登录?

    我正在使用 Node js 和 Express 制作一个简单的应用程序 它严重依赖 Google 登录来获取个人资料图片和昵称 当在新的 Electron 应用程序中测试它时 我遇到了错误 此浏览器或应用程序可能不安全 尝试使用不同的浏览器
  • mockito-core 与mockito-inline 之间的区别

    在我的项目中 我们已经有了mockito core依赖项 我想存根静态方法 我需要为其添加模拟内联依赖项 所以想了解一下它们之间的区别 它们可以共存吗 根据版本 4 2 0 的最新文档 mockito 社区似乎已经提出了 mockito i
  • FQL 流查询中 Facebook 帖子展示次数为空

    根据FQL 流文档 http developers facebook com docs reference fql stream 以下查询应该在由经过身份验证的页面所有者运行时返回展示计数 但它从未返回 我们让页面所有者直接在图形 API
  • 什么场景下才需要使用“方法隐藏”? [复制]

    这个问题在这里已经有答案了 可能的重复 隐藏在 C 中的方法并带有有效示例 为什么它在框架中实现 现实世界的优势是什么 https stackoverflow com questions 1193848 method hiding in c
  • 如何将数字(如 int)转换为“Number”?

    这可能是基本问题 但我找不到有用的东西 问题是 如何转换double or int价值Number类型 更具体地说oracle jbo domain Number 我尝试了以下方法 对于整数值 int i 9 Integer y new I
  • 如何通过 Angular 2+ 中的单元测试避免依赖地狱

    我看到很多关于如何在 Angular 2 中对简单组件进行单元测试的示例 但是当涉及到使用服务的测试组件时 维护测试床提供程序和导入就变成了一场噩梦 我怎样才能避免它 例如 我有 myComponents 它使用 myService 它使用
  • 什么定义了实时/近实时系统?

    系统是否应满足特定的指标才能被视为 分类为实时 Web 应用程序或近实时 Web 应用程序 当我看到我正在使用的系统的非功能性需求表明解决方案应实时 接近实时返回数据时 我理解这些术语的定义 如发现http en wikipedia org
  • 数独回溯 无效数独

    我创建了一个数独回溯求解器 它工作得很好 但现在如果数独无法解决 我想给出一个错误 因为它无效 例如 如果给出这个数独 http img5 imageshack us img5 2241 sudokugq jpg http img5 ima
  • MongoDB 空字符串值与 null 值

    在 MongoDB 生产中 如果某个键的值为空或未提供 可选 我应该使用空字符串值还是应该使用 null 作为值 1 使用空字符串与空字符串之间有什么优缺点吗 2 如果我将值设置为 undefined 以从现有文档中删除属性 与让属性值设置
  • 如何确定 iPhone 正在使用/解锁

    我面临的要求之一是需要检测用户是否正在使用 iPhone 即使我的应用程序也在后台 到目前为止 我找到了以下出路 但没有一个指向解锁机制 applicationProtectedDataWillBecomeUnavailable 这将告诉用
  • 当计算机通过组策略锁定时,C# SessionSwitchReason.SessionLock 不会触发

    编辑 这里的问题不是它是通过 GP 锁定的 而是它是在服务帐户下作为服务运行的 并且它无权访问交互式桌面 我有一个 C 应用程序 需要检查用户会话何时被锁定 我正在使用Microsoft Win32 SystemEvents Session
  • Java EE 身份验证:如何捕获登录事件?

    给定为 Java Web 应用程序定义的 FORM 类型的身份验证机制 如何捕获已执行登录在重定向到请求的资源之前发生事件 是否有任何类型的侦听器可以让我在用户登录时执行我的代码 我觉得定义过滤器不是最好的解决方案 因为过滤器链接到资源 即
  • PHP:使用strlen获取远程文件大小? (html)

    我正在查看 fsockopen 之类的 PHP 文档 他们说你不能在远程文件上使用 filesize 而不用 ftell 或其他东西做一些疯狂的事情 不确定他们到底说了什么 但我有一个很好的想法怎么做 file file get conte
  • setInterval() 只运行一次函数

    我想定期查询 PHP 脚本以获取新消息 为此 我使用 setInterval 函数和 AJAX document ready function var queryInterval 1000 How fast we query for new
  • C++ 类方法的 LD_PRELOAD

    我需要在 C 程序中插入方法调用 该类驻留在单独的共享库中 我以为我可以使用 LD PRELOAD 但我不确定这将如何工作 我只找到了 C 函数的示例 是否有一种方法可以为单个方法设置插入 而无需从插入的类实现中复制任何代码 只需为插入的代
  • OpenGL NURBS 曲面

    我正在学习 OpenGL 我想要一个中间有轻微驼峰的表面 我目前正在使用这段代码 但我不确定如何调整 ctrl 点以使其达到我想要的方式 它目前就像 我想要这样的 我不完全确定我应该使用哪些控制点 并且我对其工作原理感到困惑 include
  • Microsoft Cognitive API 不断告诉我:“消息”:“输入数据不是有效的图像或受密码保护。”

    我有图像的 base64 字符串 我正在尝试将其转换为 应用程序 八位字节流 因为这就是 api 所需要的 我认为我已经通过创建一个 blob 来做到这一点 正如您从我的函数中看到的那样 当我进行 api 调用时 我不断收到标题中的消息 有
  • 如何通过 JOIN 组合(合并)相似的列以删除 NULL

    问题简介 我有一个名为 客户 的超类表和两个从客户继承的名为 个人 和 公司 的子表 因此 客户实体与 人 或 公司 具有一对一的关系 客户只能是 个人 或 公司 但不能同时是两者 如下所示 Customer Person Company