【问题标题】:Left join behavior左连接行为
【发布时间】:2018-09-27 20:55:09
【问题描述】:

我在下面有一个小问题。 #t1 和#t2 是两张小桌子。我正在尝试为这两个表做一个简单的左连接,我看到了输出。

查询:

    create table #t1 (cid int, program varchar(20), PP varchar(20), Startdate date, enddate date,codeset varchar(20),visitID int)
insert into #t1
values
(1001,'P1','ORD','2018-09-27','2018-09-28','OL',150),
(1001,'P2','ORD','2018-09-29',NULL,'IR',151)

create table #t2 (cid int,visitID int, answer varchar(20))
insert into #t2 
values
(1001,150,'Credited')

select t1.cid, t1.Startdate, t1.Enddate,t2.answer
from #t1 t1
left join #t2 t2 on  t1.cid = t2.cid 

drop table #t1, #t2

输出是:

对于左连接的逻辑,左表中的所有记录和右表中的匹配记录都应该显示出来。 #t1 中不存在此类记录时,为什么我在第二行看到“已贷记”?

想要的输出:

我错过了一些愚蠢的东西,无法弄清楚。有什么帮助吗?!

【问题讨论】:

  • 它在 CID 上加入,它在两行中,所以 Credited 显示在两行中
  • 您加入cid 并且对于来自#t1 的两行,cid1001 并且带有cid 的行1001 也存在于#t2 中。所以它被连接到两行。这就是左连接的工作原理。
  • t2 需要额外的列来指示它是连接到t1 中的第一行还是第二行。如果没有这个条件,它将加入两者。
  • EndDate 告诉你什么?这对我来说毫无意义。这对它是否应该说 Credited 有重要意义吗?如果是这样,您需要将其包含在连接条件中
  • 连接行为正确。另一方面,你的逻辑有问题。

标签: sql sql-server left-join


【解决方案1】:

您正在看到预期的行为。您正在加入 CID。 #t2 中的单个记录的 CID 值为 1001。这与 #t1 中的两条记录匹配,因为 #t1 中的两条记录的值均为 1001;因此,您的结果中有两行,列 answer 的值为 Credited。

【讨论】:

  • 同意。开始日期 9/29 的 1001 在 #t2 中没有记录,那么为什么它显示“Credited” thr?如何将第二条记录的答案设为 NULL?
  • 是否还有其他列您没有告诉我们?对于#t1 中的第二行,CID 的值应该不同吗?根据我们到目前为止的详细信息,内连接和左连接将给出与此数据集相同的结果。
  • 还有其他列。将更新问题
【解决方案2】:

你显然想加入cid visitid

SELECT t1.cid,
       t1.startdate,
       t1.enddate,
       t2.answer
       FROM #t1 t1
            LEFT JOIN #t2 t2
                      ON t1.cid = t2.cid
                         AND t1.visitid = t2.visitid;

【讨论】:

    【解决方案3】:

    我认为您无法通过您拥有的数据和连接条件获得这样的输出。您通过 cid 将 #t1 连接到 #t2 并且您在 #t2 表中的两条记录具有相同的 cid,这意味着来自 #t2 的一条 cid 为 1001 的记录将连接到表 #t2 中的两条记录。

    如果您将 #t1 中第二行的 id 更改为 1002,您可以获得这样的输出,但我不知道它是否适合您的任务。

    【讨论】:

      【解决方案4】:

      如果您只想在指定了 EndDate 的地方显示 Credited,您需要添加到您的加入条件。

      select t1.cid, t1.Startdate, t1.Enddate,t2.answer
      from #t1 t1
      left join #t2 t2 on  t1.cid = t2.cid AND t1.EndDate IS NOT NULL
      

      如果是 visitID 而不是 EndDate 导致此问题,则使用此查询:

      select t1.cid, t1.Startdate, t1.Enddate,t2.answer
      from #t1 t1
      left join #t2 t2 on  t1.cid = t2.cid AND t1.visitId = 150
      

      我们现在没有足够的信息来真正了解您的逻辑需要什么,但它可能看起来像上面那样。

      【讨论】:

      • 请不要回答不清楚的问题,这会弄得一团糟。发表评论,要求澄清编辑。
      • Philip 问题的根源很清楚,但这里不那么重要的细节仍然缺失
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多