【问题标题】:SQL Server 2012 INNER JOIN returning records that it shouldn'tSQL Server 2012 INNER JOIN 返回不应该的记录
【发布时间】:2014-11-17 19:58:28
【问题描述】:

使用 SQL Server 2012,并给出以下代码(修改为“隐藏”内容)...

select T1.ID
    ,T2.F2
    ,T2.F3
    ,T2.F4
from (
         select distinct ID
         from A1
     ) T1
         inner join (
                        select ID
                            ,F2
                            ,F3
                            ,F4
                        from A2
                    ) T2 on T1.ID = T2.ID
where T2.F2 not in (V1,V2,V3,V4) and
    T2.F3 in (V5,V6,V7,V8)

...我的目标是从 T1 和 T2 这两个表中获取具有匹配 ID 的项目列表。所有条件都在 T2 表上,而 T1 表用于仅获取那些按 ID 匹配的记录。非常坦率的。但是...我从 T2 获取记录,但在 T1 中没有匹配的 ID。即使条件在 T2 上,我仍然应该期望 T1 控制返回哪些 ID。

ID 的值:

T1: 3, 5, 6, 7, 10
T2: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

我希望返回:

T1: 3, 5, 6, 7, 10
T2: 3, 5, 6, 7, 10

但我似乎得到的是:

T2: 1, 3, 4, 5, 6, 7, 8, 10

我什至尝试在所有其他内容之后重新引入 T1 唯一 ID(如 C1)...

select B1.ID
    ,B1.F2
    ,B1.F3
    ,B1.F4
from (
         select T1.ID
             ,T2.F2
             ,T2.F3
             ,T2.F4
         from (
                  select distinct ID
                  from A1
              ) T1
                  inner join (
                                 select ID
                                     ,F2
                                     ,F3
                                     ,F4
                                 from A2
                             ) T2 on T1.ID = T2.ID
         where T2.F2 not in (V1,V2,V3,V4) and
             T2.F3 in (V5,V6,V7,V8)
     ) B1
         inner join (
                        select distinct ID
                        from A1
                    ) C1 on B1.ID = C1.ID

...但是不行。结果相同。

看起来它应该是一个直接的内连接,但它更像是一个右连接。有什么想法或建议吗?

【问题讨论】:

  • 在末尾添加另一个AND t1.id=t2.id
  • 它不会运行。构造查询的方式,为连接公开的唯一 ID 来自 B1 和 C1。 T1 和 T2 在 B1 子查询中,因此无法在外部访问。但我感谢您的快速回复!
  • 对不起。我的意思是说我试过了,它不会运行。我尽量不要太傲慢,以至于我会立即放弃帮助!
  • 使用相关子查询(select distinct ID from A1 WHERE A1.ID=A2.ID)

标签: sql-server sql-server-2012 inner-join


【解决方案1】:

在这种情况下我会使用 EXISTS:

select T1.ID
  ,T2.F2
  ,T2.F3
  ,T2.F4
from A2 T2
where T2.F2 not in (V1,V2,V3,V4) 
  and T2.F3 in (V5,V6,V7,V8)
  and exists(
    select * from A1 T1 where T1.ID = T2.ID)

这要简单得多,只会为您提供 T2 中在 T1 中具有匹配记录的那些记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多