如何在一个相关字段存在但另一个不存在的情况下返回结果?

时间:2018-06-19 15:57:06

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

我敢肯定有一个简单的方法可以做到这一点,但是我什至无法想到如何准确地描述我想做的事情,因此我无法使用它。我的实际情况比这稍微复杂一些,但是一个非常基本的版本将有两个单独的表-一个显示购买公交车票的人的名字和日期,另一个显示在公交车上旅行的人的名字和日期。公交车,像这样

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的票相匹配。

我认为最好的方法是使用join,但是我不确定如何做。如果我加入custName,它将在tim买票并在15年7月1日旅行的行中创建一个行(这很好),但在他在15年7月1日购买车票并在2月7日旅行的行中创建一个行-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的所有行,这将为我提供蒂姆和罗伯没有机票所经过的旅程的详细信息。

很抱歉,如果我完全把错误的树种了。我敢肯定这确实很容易,但是我实在无法绕开它。

1 个答案:

答案 0 :(得分: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;