连接3个表并检索所有表中的所有记录

2024-02-03

我正在连接三个表(执行完整的外部连接),以便可以从所有表中检索所有记录。我面临的问题是我加入表的顺序。

表格信息

替代文本 http://img235.imageshack.us/img235/7980/tableinfoow1.png http://img235.imageshack.us/img235/7980/tableinfoow1.png

(1) 如果我按 TABLE1、TABLE2、TABLE3 顺序连接表,我会得到两行用于记录团队 B 和级别 1。

SELECT DISTINCT 
    (CASE WHEN T0.[TEAM] IS NOT NULL THEN T0.[TEAM] WHEN T1.[TEAM] IS NOT NULL THEN T1.[TEAM] WHEN T2.[TEAM] IS NOT NULL THEN T2.[TEAM] ELSE T0.[TEAM] END) AS [TEAM], 
    (CASE WHEN T0.[LEVEL] IS NOT NULL THEN T0.[LEVEL] WHEN T1.[LEVEL] IS NOT NULL THEN T1.[LEVEL] WHEN T2.[LEVEL] IS NOT NULL THEN T2.[LEVEL] ELSE T0.[LEVEL] END) AS [LEVEL], 
    T0.[VALUE1] AS [VALUE1], 
    T1.[VALUE2] AS [VALUE2], 
    T2.[VALUE3] AS [VALUE3] 

FROM TABLE1 T0
FULL JOIN TABLE2 T1 ON T0.[TEAM] = T1.[TEAM] AND T0.[LEVEL] = T1.[LEVEL] 
FULL JOIN TABLE3 T2 ON T0.[TEAM] = T2.[TEAM] AND T0.[LEVEL] = T2.[LEVEL]

(2) 如果我按 TABLE2、TABLE3、TABLE1 顺序连接表,我会在输出中得到正确的行数。

SELECT DISTINCT 
    (CASE WHEN T0.[TEAM] IS NOT NULL THEN T0.[TEAM] WHEN T1.[TEAM] IS NOT NULL THEN T1.[TEAM] WHEN T2.[TEAM] IS NOT NULL THEN T2.[TEAM] ELSE T0.[TEAM] END) AS [TEAM], 
    (CASE WHEN T0.[LEVEL] IS NOT NULL THEN T0.[LEVEL] WHEN T1.[LEVEL] IS NOT NULL THEN T1.[LEVEL] WHEN T2.[LEVEL] IS NOT NULL THEN T2.[LEVEL] ELSE T0.[LEVEL] END) AS [LEVEL], 
    T0.[VALUE1] AS [VALUE1], 
    T1.[VALUE2] AS [VALUE2], 
    T2.[VALUE3] AS [VALUE3] 

FROM TABLE2 T0
FULL JOIN TABLE3 T1 ON T0.[TEAM] = T1.[TEAM] AND T0.[LEVEL] = T1.[LEVEL] 
FULL JOIN TABLE1 T2 ON T0.[TEAM] = T2.[TEAM] AND T0.[LEVEL] = T2.[LEVEL]

我面临的问题是我不知道输入表并在运行时将所有这些表作为用户的输入并执行联接。我无法一次合并两个表,因为从技术上讲,我的表可以一次合并三个以上的表(最多 9 或 10 个)。

如何确保从所有表中获取所有记录(使用完整外连接),但不要像 #1 中那样获取两行。


如果这是您所需要的:

TEAM LEVEL  Value1  Value2  Value3
A   1        1       NULL    NULL
B   1        NULL    1000    900

然后您可以通过以下方式实现这一目标:

SELECT [TEAM], [LEVEL], MAX(v1) Value1, MAX(v2) Value2, MAX(v3) Value3
FROM (
    SELECT [TEAM], [LEVEL], Value1 v1, NULL v2, NULL v3
    FROM TABLE1
    UNION
    SELECT [TEAM], [LEVEL], NULL, Value2, NULL
    FROM TABLE2
    UNION
    SELECT [TEAM], [LEVEL], NULL, NULL, Value3
    FROM TABLE3
) t0
GROUP BY [TEAM], [LEVEL]

您可以根据需要使用任意数量的表。

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

连接3个表并检索所有表中的所有记录 的相关文章

随机推荐

  • Veins 中汽车和行人之间的通信

    我想知道如何在 Veins 中创建汽车和行人之间的无线通信 V2P 感谢您的关注 Veins 允许为其从 SuMO 获得的车辆类型指定模块 静脉 多种车辆类型的多种应用 https stackoverflow com questions 4
  • 有没有办法在 CSS 计算中包含 pi ?

    我有一个用于进度条的 SVG 圆形动画 其中stroke dashoffset动画来自0 radius to radius 0 0 到 100 圆的周长的方程是pi d 有没有办法使用CSScalc函数可以使用 pi 值 而不仅仅是舍入值
  • 将 MongoDB 与本机驱动程序和 Express.js 结合使用时,“拓扑被破坏”

    我已经实现了从 MongoDB 获取数据的简单应用程序 const express require express const app express const port 3000 const MongoClient require mo
  • 求两个数组中最大的共同元素?

    给定两个数组 如何找到两个数组的最大公共元素 我正在考虑对两个数组 n log n 进行排序 然后对另一个数组中一个已排序数组 从较大的数组开始 中的每个元素执行二分搜索 直到找到匹配项 eg a 1 2 5 4 3 b 9 8 3 Max
  • Android - 限制 backStack 中的片段数量?

    目前我有一项活动 并且正在向其中添加片段 搜索 歌曲详细信息 设置等 我实现了基于侧面的菜单导航 因此现在 作为副作用 添加到 Backstack 的片段数量没有限制 有什么方法可以限制片段的数量 或删除旧的条目 例如 每个歌曲详情片段都有
  • Lua字符串char编码

    我看不到 Lua 对其字符串使用什么编码 Im using string byte s i j 其中有文档 返回字符 s i s i 1 的内部数字代码 s j i 的默认值为 1 j 的默认值为 i 请注意 数字代码不一定可以跨平台移植
  • 在java apache.commons.io中,如何避免读取旧的日志消息

    我正在使用 java Tail listener API 来执行 tailf 功能 在 Linux 中 即 每当日志文件中更新日志消息时 此 API 就会打印消息 我的代码如下 public static void main String
  • 使用 BigCommerce API 获取产品图像

    长话短说 几个月前 我使用 Bigcommerce API 为 WordPress 制作了一个插件 用于获取小组件区域中的产品 现在我已经更新了单个文件 Bigcommerce php 现在函数 getProductImages 不存在 我
  • 为什么编译器除以 2 时会右移 31 位?

    我已经反汇编了编译器生成的代码 我发现它生成了以下指令序列 mov eax edx shr eax 1Fh add eax edx sar eax 1 这段代码的目的是什么 我知道 sar eax 1 除以 2 但是什么 shr eax 1
  • 在 Visual Studio IDE 中查看与类关联的控件列表

    我用的是VS的表单设计器 我放置了一个label on my form 然后删除它的文本 目前 我无法找到该标签 如何查看与给定类关联的控件列表 查看 gt 其他窗口 gt 文档大纲
  • 使用 ajax 请求中的 JSON 响应更新 JQuery 进度条

    All 我有一个 AJAX 请求 它向服务器发出 JSON 请求 以获取同步状态 JSON 请求和响应如下 我想显示 JQuery UI 进度条并根据 getStatus JSON 响应中返回的百分比更新进度条状态 如果状态为 insync
  • SQLite CASE/WHEN 语句

    这是我的 CASE WHEN 声明 但正如你所看到的 我收到了这个错误 我不知道为什么 我想做的就是检测 MAJKA 字段中的某些内容何时发生更改 因此 如果 MAJKA 列的某些其他字段为空 请不要触摸它们 而是将值更改为 MAJKA 列
  • 从哈希数组中收集值

    我有以下格式的数据结构 data hash price 1 count 3 price 2 count 3 price 3 count 3 有没有一种有效的方法来获取值 price作为一个数组 1 2 3 首先 如果您使用 ruby arr
  • Laravel 5.4 中的混合/版本图像?

    我想对一组图像使用混合 首先我复制它们 mix copy resources images public images 然后版本 mix version 上面的内容对图像没有任何作用 我也尝试过指定路径 mix version public
  • 在 android.webkit.CookieManager 中存储会话 cookie

    我使用 Volley 库来执行我的应用程序的请求 现在我确实需要按照以下顺序执行一些操作 使用 Volley 库的 POST 请求 我收到带有会话 cookie 的 204 响应 我需要将该 cookie 设置为与 WebView 一起使用
  • 如果使用回形针 gem on Rails 没有上传图片,如何设置默认图片?

    下面是我的代码 class Profile lt ActiveRecord Base belongs to user validates first name presence true validates last name presen
  • 使 git diff 正确显示 UTF8 编码的字符

    我有一个文件 其中包含使用 UTF8 编码的瑞典语字符 If I cat文件显示正常 但如果我这样做git diff特殊字符被打印 例如 Example git diff output name Magler
  • 如何在单个域上为 React app + Express 设置 k8s 入口?

    我有一个使用 React 构建的前端应用程序和在 Nodejs 上构建的后端应用程序 两者都有一个单独的 Docker 镜像 因此在 k8s gce 上有一个单独的部署 每个部署都有对应的k8s服务 比方说fe serice and be
  • 验证嵌套形式中子对象的唯一性无法正常工作

    我对 Rails 中的范围唯一性验证有疑问 如果我尝试直接在子模型中创建具有不想重复的同一组属性的新对象 则效果很好 但是当我尝试创建具有两个不唯一的子对象的父对象时 验证没有被触发 背景 我有一个 Rails 3 2 中的应用程序 其视图
  • 连接3个表并检索所有表中的所有记录

    我正在连接三个表 执行完整的外部连接 以便可以从所有表中检索所有记录 我面临的问题是我加入表的顺序 表格信息 替代文本 http img235 imageshack us img235 7980 tableinfoow1 png http