【问题标题】:SQL inner join on column A and compare values in column B列 A 上的 SQL 内连接并比较列 B 中的值
【发布时间】:2021-06-23 11:16:29
【问题描述】:

我确信或者希望有一种简单的方法可以做到这一点。下面是我最近的尝试。查询应该只返回一行,但我得到 31。

查询:

    `select distinct a.[EC CERS], a.[EC Tank ID], [CIW Tank ID]
    from #tempectank a  
    inner join #tempciwtank b on a.[EC CERS] = b.[CIW CERS] 
    where a.[EC Tank ID] <> b.[CIW Tank ID]`

表格数据:

表 A

EC CERS EC Tank ID
100338 1
100338 2
100338 3

表 B

CIW CERS CIW Tank ID
100338 001
100338 2
100338 3

表架构

    create table #tempectank(
    s int IDENTITY (1, 1),
    [EC CERS] varchar(9),
    [EC Tank ID] varchar(255)
    )

我需要查询返回一行,最好显示 EC CERS、EC Tank ID 和 CIW Tank ID。

【问题讨论】:

  • 请标记您的 dbms。
  • 请包含表架构和预期输出
  • 你想要什么行——获取该行的规则是什么——不清楚你对给出的数据和描述的期望是什么
  • 表应该在 CERS ID 上进行内部连接。我需要 Tank ID 不匹配的行。例如,在一种情况下,EC Tank ID 为 6,CIW Tank ID 为 WRP North。我希望返回此行和 Tank ID 不匹配的任何其他行。

标签: sql sql-server inner-join string-matching


【解决方案1】:

如果是领导 ziros 的问题,你可以用这个解决方案:

如果您的 ID 中包含非数字,这将不起作用

Select a.[EC CERS], a.[EC Tank ID], b.[CIW Tank ID]
from #tempectank a  
inner join #tempciwtank b 
    on a.[EC CERS] = b.[CIW CERS] 
    and a.[EC Tank ID] <> b.[CIW Tank ID]
    and cast(a.[EC Tank ID] as int ) =  cast(b.[CIW Tank ID] as int)

实际上另一种解决方案是显示您找不到匹配项:

select * from #tempectank a   
where not exists (select 1 from #tempciwtank b 
                   where a.[EC CERS] = b.[CIW CERS] 
                     and a.[EC Tank ID] = b.[CIW Tank ID]
                 )
and exists (select 1 from #tempciwtank b where a.[EC CERS] = b.[CIW CERS])

如果你想并排显示不匹配的案例,你必须从两边找到不匹配的实例:

select * from (
select * from #tempectank a   
where not exists (select 1 from #tempciwtank b 
                   where a.[EC CERS] = b.[CIW CERS] 
                     and a.[EC Tank ID] = b.[CIW Tank ID]
                 )
and exists (select 1 from #tempciwtank b where a.[EC CERS] = b.[CIW CERS])
) a 
join (
select * from #tempciwtank b 
where not exists (select 1 from #tempectank a   
                   where a.[EC CERS] = b.[CIW CERS] 
                     and a.[EC Tank ID] = b.[CIW Tank ID]
                 )
and exists (select 1 from #tempectank a  where a.[EC CERS] = b.[CIW CERS])
)b 
on  a.[EC CERS] = b.[CIW CERS] 

【讨论】:

  • 此查询返回一行,但如果字段值是字母数字,它会起作用吗?
  • 刚刚尝试对整个数据集进行查询并收到“将 varchar 值 '#1' 转换为数据类型 int 时转换失败。”
  • 不,不会的。但如果有不同的模式,你可以通过另一种方法找到它们
  • 我没有一致的模式。我看到整数、字母数字和文本。例如,在一种情况下,EC Tank ID 为 6,CIW Tank ID 为 WRP North。
  • 哇,太好了。有没有办法显示 CIW 坦克 ID?查询按原样返回 16 行,但当我尝试在 a.[EC CERS] = b.[CIW CERS] 上进行内部连接 ​​#tempciwtank b 时返回 49
【解决方案2】:

如果您想要 a.[EC CERS] = b.[CIW CERS] 和 a.[EC Tank ID] b.[CIW Tank ID] 的行,请尝试以下操作:

Select a.[EC CERS], a.[EC Tank ID], b.[CIW Tank ID]
from #tempectank a  
inner join #tempciwtank b 
           on a.[EC CERS] = b.[CIW CERS] 
           and a.[EC Tank ID] <> b.[CIW Tank ID]

【讨论】:

  • 我认为这不是 OP 想要的。从技术上讲,它按照措辞所说的那样做,但它可能想要没有匹配的记录,而不是具有所有差异的笛卡尔积。
  • 我试过卡子查询,错误是正确的。我只需要一行。
  • @TryingtoCode 有帮助吗?如果不是,那么您希望查询返回哪一行。
  • 我可以知道downvoating背后的原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2021-06-27
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多