【问题标题】:How to return results where one related field exists, but another does not?如何返回一个相关字段存在但另一个不存在的结果?
【发布时间】:2018-06-19 15:57:05
【问题描述】:

我确信有一种简单的方法可以做到这一点,但我什至想不出如何准确地描述我想要做什么,所以我无法谷歌它。我的实际情况比这稍微复杂一些,但一个非常基本的版本将有两个单独的表格 - 一个显示购买公共汽车票的人的姓名和日期,另一个显示乘坐公共汽车的人的姓名和日期公交车,像这样

tableTicket                tableTravel

custName    ticketDate      custName    travelDate
--------    ----------      --------    ----------
tim         01-jul-15       tim         01-jul-15
tim         03-jul-15       tim         02-jul-15
anna        15-jul-15       tim         03-jul-15
anna        16-jul-15       anna        15-jul-15
anna        20-jul-15       anna        16-jul-15
emily       02-jul-15       rob         07-jul-15
rob         07-jul-15       rob         12-jul-15
rob         12-jul-15       rob         13-jul-15

我只想返回没有机票旅行的人的姓名和日期,而不是那些买了机票但没有旅行的人。所以我想在 15 年 7 月 2 日返回蒂姆的旅程,而不是 15 年 7 月 2 日返回艾米丽未使用的机票。

我遇到的问题是,我不能只查找出现在 ticketDate 中的 travelDate 的日期,因为这样它将把 tim 的旅程与 emily 的机票相匹配。

我认为最好的方法是使用连接,但我不确定如何。如果我加入 custName,它会创建一行,其中 tim 购买机票并于 15 年 7 月 1 日旅行(这很好),但也会创建一行,他在 15 年 7 月 1 日购买机票并于 7 月 2 日旅行-15.

理想情况下,我想最终得到一张这样的桌子,但我不知道如何到达那里

custName    ticketDate      travelDate
--------    ----------      --------    
tim         01-jul-15       01-jul-15
tim         NULL            02-jul-15
tim         03-jul-15       03-jul-15
anna        15-jul-15       15-jul-15
anna        16-jul-15       16-jul-15
anna        20-jul-15       NULL
emily       02-jul-15       NULL
rob         07-jul-15       07-jul-15
rob         12-jul-15       12-jul-15
rob         NULL            13-jul-15

然后我可以选择ticketDate IS NULL 所在的所有行,它会为我提供 Tim 和 Rob 在没有票的情况下所进行的旅程的详细信息。

抱歉,如果我完全看错了树。我敢肯定这很容易,但我就是想不通。

【问题讨论】:

  • 请向我们提供创建和插入语句
  • 对不起,我不确定你的意思——我在上面输入的数据库实际上并不存在,我只是编造它,因为它更清楚地解释了我想要什么比我使用我正在使用的实际数据库做的更好,它充满了各种其他 gumpf。
  • 你解释清楚了。为了测试我们的查询,我们需要 DDL 和 insert 语句。
  • 真的很抱歉,我不知道你的意思。 (我对此很陌生)
  • @themightyshrub 除非您提供数据供我们测试,否则没有人会帮助您。学习如何提问。 stackoverflow.com/help/how-to-ask

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

你似乎想要FULL OUTER JOIN

select coalesce(tk.custName, tr.custName) as custName, tk.ticketDate, tr.travelDate
from tableticket tk full outer join
      tabletravel tr
      on tr.custname = tk.custname and tr.travelDate = tk.ticketDate;

【讨论】:

  • 谢谢你,这很完美!我之前尝试过外部连接,但我没有意识到你可以加入多个列,而且我没有听说过合并。感谢您的明确回复:)
  • @themightyshrub。 . . Coalesce()isnull() 中的SQL Server 类似。
  • @themightyshrub。 . .但是,coalesce() 函数是 ANSI SQL 标准,几乎可以在所有 DBMS 中使用。
猜你喜欢
  • 2018-04-10
  • 2011-06-10
  • 2017-11-17
  • 1970-01-01
  • 2020-11-29
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2022-09-14
相关资源
最近更新 更多