多个 join 语句未返回预期结果

2023-12-28

我必须编写一个具有以下要求的查询:

查询应该返回所有的列表 名为的客户的条目值 “Steve”以及显示的每个日期(如果 可用)的最新状态详细信息 那个日期。

顾客表

CustomerID | CustomerName
1          |    Steve
2          |    John

参赛表

CustomerID | EntryDate | EntryValue 
 1         | 5/4/2010  |    200.0  
 1         | 4/4/2010  |    100.0  
 1         | 3/4/2010  |    150.0
 1         | 2/4/2010  |    170.0
 2         | 5/4/2010  |    220.0

状态表

CustomerID | StatusDate | Detail
1          | 5/28/2010  | D
1          | 4/24/2010  | S
1          | 4/5/2010   | P
1          | 2/28/2010  | A

预期输出是:

CustomerName |   Date    |   OrderCost |   Detail 
  Steve      | 5/4/2010  |    200.0    |  S
  Steve      | 4/4/2010  |    100.0    |  A
  Steve      | 3/4/2010  |    75.0     |  A
  Steve      | 3/4/2010  |    75.0     |  <null>

我认为预期的输出可能是错误的,实际上应该是:

CustomerName |   Date    |   OrderCost |   Detail 
  Steve      | 5/4/2010  |    200.0    |  S
  Steve      | 4/4/2010  |    100.0    |  A
  Steve      | 3/4/2010  |    150.0     |  A
  Steve      | 2/4/2010  |    170.0     |  <null>

鉴于要求,我不明白为什么 3/4/2010 日期会出现两次,并且第二次会有详细信息。我写了以下查询:

我写了以下查询:

SELECT  Customers.CustomerName, Entries.EntryDate, Entries.EntryValue, Status.Detail
FROM   Customers
    INNER JOIN Entries ON Customers.CustomerID = Entries.CustomerID
    LEFT OUTER JOIN Status ON Status.CustomerID = Customers.CustomersID AND Status.StatusDate <= Entries.EntryDate
WHERE (Customers.CustomerName = 'Steve')

我的查询结果是这样的:

CustomerName| EntryDate |   EntryValue |   Detail
Steve      |  5/4/2010 |    200.00  |   S
Steve      |  5/4/2010 |    200.00  |   P
Steve      |  5/4/2010 |    200.00  |   A
Steve      |  4/4/2010 |    100.00  |   A
Steve      |  3/4/2010 |    150.00  |   A
Steve      |  2/4/2010 |    170.00  |   NULL

关于我在这里做错了什么的任何提示吗?我想不通...

Update我已将顺序更改为条目,因此它不会让我们感到那么困惑。


您获得的结果比您预期的要多,因为状态表中的许多行都满足第二个 JOIN 条件(例如,有 3 个 statusDates 早于 5/4,因此该日期在结果集中出现了 3 次)。

您需要加入状态表,但只获得一个匹配项(最新的)。这可以通过多种方式完成,据我所知通常使用子查询。我认为你的情况相当复杂 - 我使用了临时表。希望它有帮助......(我目前没有数据库来测试它,希望没有愚蠢的语法错误)。

DROP TABLE IF EXISTS temp;

CREATE TABLE temp AS  -- This temp table is basically the result set you got
 (SELECT c.CustomerName, e.EntryDate, e.EntryValue, s.Detail, s.StatusDate
  FROM Customers c
    INNER JOIN Entires e ON c.CustomerID = e.CustomerID
    LEFT OUTER JOIN Status s ON s.CustomerID = c.CustomersID
                    AND s.StatusDate <= e.EntryDate
  WHERE (c.CustomerName = 'Steve')
 );

SELECT t.CustomerName, t.EntryDate, t.EntryValue, t.Detail
FROM temp t
WHERE t.StatusDate = (SELECT MAX(t2.StatusDate) 
                      FROM temp t2 
                      WHERE t2.EntryDate = t.EntryDate);

To refrain from creating a temp table I believe this will work (please try and do let me know!)

SELECT t.CustomerName, t.EntryDate, t.EntryValue, t.Detail
FROM (SELECT c.CustomerName, e.EntryDate, e.EntryValue, s.Detail, s.StatusDate
      FROM Customers c
      INNER JOIN Entries e ON c.CustomerID = e.CustomerID
      LEFT OUTER JOIN Status s ON s.CustomerID = c.CustomersID
                      AND s.StatusDate <= e.EntryDate
      WHERE c.CustomerName = 'Steve') AS t
WHERE t.StatusDate = (SELECT MAX(t2.StatusDate)
                      FROM temp t2
                      WHERE t2.EntryDate = t.EntryDate);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个 join 语句未返回预期结果 的相关文章

随机推荐

  • 如何强制Android重新索引手机上的所有照片?

    我注意到 Galaxy Nexus 处理照片和文件目录的方式有些奇怪 我创建了它们 但 Android 4 2 2 在您重新启动之前并不知道它们存在 至少在我的 Nexus 4 上是这样 我正在创建一个应用程序 当拍照并将其存储在图片中时
  • 没有找到适合完成该操作的成像组件 WPF vb.net

    我使用 WPF 应用程序中的以下代码将图像插入到 mdb 数据库中 Dim con As New OleDbConnection Provider Microsoft ACE OLEDB 12 0 Data Source GetCurren
  • Twilio 加入 Google Hangouts 电话会议

    我正在使用 GSuite 附带的 Google Hangouts for Enterprise 当 Google Hangouts 会议开始时 它会提供带有 PIN 码的拨入号码 1 xxxx xxxx 3235 一些 PIN 码 3495
  • 日期范围的 URL 约定

    在友好 URL 中显示日期范围的可接受约定是什么 例如 在时间跟踪应用程序中 我希望使用用户更容易区分的内容 而不是在 URL 中使用数据库的主键来表示特定的付款周期 http www mytimesheet com 11 1 2009 1
  • 在 Perl 中检查字符串是否为空的正确方法是什么?

    我一直在使用此代码来检查字符串是否为空 if str 与不等于运算符相反 if str 这似乎有效 我认为 但我不确定这是正确的方法 或者是否存在任何不可预见的缺点 只是感觉有些不对劲 对于 Perl 中的字符串比较 请使用eq or ne
  • 如何从手机启动 Android Wear 活动

    我一直在从事一个项目 我需要手机上的按钮来启动手表上的活动 我一直在查看 sdk 中的数据层示例 但无法使其工作 我设置了一个可穿戴侦听器服务类 但它没有接收任何消息 该服务已添加到清单中 但仍然无法运行 我也有其他服务 我想我可能有太多服
  • Mockito ArgumentCaptor 返回 Null

    我正在尝试使用 Mockito ArgumentCaptor 在我的方法中获取 mime 消息 当我取回捕获对象时 它的值为空 我对调试它很陌生 但 Mockito 用增强器包装了它 所以我看不到内容 这适用于我的方法中的对象 有人有想法吗
  • Zookeeper/SASL 校验和失败

    如何修复生成此错误的问题 WARN NIOServerCxn Factory 0 0 0 0 0 0 0 0 2181 ZooKeeperServer 1040 Client failed to SASL authenticate java
  • Mercurial 如何压缩存储库中的文件?

    我发现 Mercurial 有效地压缩了存储库中的文件 repo hg store data 有谁知道存储库文件使用哪种压缩方式 Thanks Mercurial 存储库中有两个压缩级别 增量存储和zlib压缩 https www merc
  • Flask登录成功后如何重定向到上一页

    我有一个网络应用程序 我不使用 Flask 登录 如果用户访问链接但未登录 我会将用户重定向到登录页面 我在会话中设置 用户名 并检查当用户尝试直接访问某些链接而不登录时 即在这种情况下用户名将为空 我尝试遵循这个二氧化硫溶液 https
  • 如何为 Angular 2 安装和导入 paperjs?

    我尝试使用命令安装 paperjs sudo npm install paper 在我的角度应用程序文件夹中 纸张似乎出现在 node modules 文件夹中 但是当我尝试使用导入它时 import Paper from paper 它没
  • 检查触发器是否存在

    我对公共模式中所有表的触发器有以下查询 SELECT CREATE TRIGGER tab name if modified trg INSERT OR UPDATE OR DELETE ON tab name FOR EACH ROW E
  • Angular 使用变量或循环创建选择器标签

    我需要使用变量创建 app component html 的选择器标签 假设变量名称为 componentVar string 我需要我的 app component html
  • 如何为 Azure 中的每个分支设置不同的管道

    我有一个项目 但有两个 主 分支 master 虚拟 主控 他们每个人都会有自己的azure pipeline yml具体针对他们的分支机构 第一条管道在master触发器设置为 trigger batch true branches in
  • 返回花括号在 javascript 中意味着什么(例如 return { init : init} )[重复]

    这个问题在这里已经有答案了 我正在查看这段代码 function var sidescroll function init function STUFF return init init What does this do sidescro
  • 以编程方式创建 UITextField 事件

    我在创建行时以编程方式将文本字段添加到 TableView 中 我试图通过这样做来订阅这些文本字段的 TouchUpInside 事件 UITextField eTextField UITextField alloc initWithFra
  • Android 垃圾收集器是否会在运行时暂停其他应用程序?

    我发现一些关于 Android 垃圾收集器的信息与我矛盾 Android 开发者指南 说道 Android 3 0 是该平台的第一个版本 旨在运行于 单核或多核处理器架构 各种各样 Dalvik VM Bionic 库和其他地方的更改增加了
  • Clang 融合乘加取决于表达式参数的恒定性

    正如答案中所示clang 14 0 0 浮点优化 https stackoverflow com questions 73985098 clang 14 0 0 floating point optimizations 自版本 14 起 C
  • 使用 Cython 优化 NumPy

    我目前正在尝试优化我用纯Python编写的代码 这段代码使用NumPy http en wikipedia org wiki NumPy当我使用 NumPy 数组时 工作量非常大 下面你可以看到我转换成的最简单的课程Cython http
  • 多个 join 语句未返回预期结果

    我必须编写一个具有以下要求的查询 查询应该返回所有的列表 名为的客户的条目值 Steve 以及显示的每个日期 如果 可用 的最新状态详细信息 那个日期 顾客表 CustomerID CustomerName 1 Steve 2 John 参