如何将两个表与一个具有临时列名的表进行比较

时间:2017-03-26 22:42:22

标签: sql sql-server

我有两个表,都有列ID_Number和版本。但是,ID_number的格式不同。我的目标是比较两个表并输出具有相同ID_number但不同版本的任何行。

格式差异如下:

EG。第一个表中的ID号是" 23-4567"。     第二个表中的相应ID号是" 1023004567"。 " 10"在" 23"之前添加和" - "被替换为" 00"。所有ID都是一样的。

首先,我使用" substring"使table1中的ID_Number与table2中的ID_Number匹配,并将该新列重命名为newIDNumber(table1),并将newIDNumber(table1)与ID_Number(table2)进行比较。对于上面的例子,在table1中转换ID_Number的代码是这样的,

Eg. '10' + SUBSTRING(@ID_number, 1, 2) + '00' + SUBSTRING(@ID_number, 4,4) AS newIDNumber

现在我编写以下代码来检查版本差异

  SELECT ID_Number, version, "10" + SUBSTRING(@ID_number, 1, 2) + "00" + SUBSTRING(@ID_number, 4,4) (From first table) AS newIDNumber
FROM table1 
WHERE (NOT EXISTS
        (SELECT ID_Number, version
        FROM table2 
        WHERE (table1.newIDNumber= table2.ID_Number) AND (table1.version = table2.version)

        )
        )

它输出错误,说明"未知列' table1.newIDNumber'在' where子句'"。如何在不中断数据库的情况下进行比较(将newIDNumber列插入table1)?

"声明newIDNumber"工作?

2 个答案:

答案 0 :(得分:0)

SELECT 
    ID_Number
    , version
FROM 
    table1 
WHERE
    NOT EXISTS
    (
        SELECT  1
        FROM    table2 
        WHERE
            "10" + SUBSTRING(table1.ID_number, 1, 2)
            + "00" + SUBSTRING(table1.ID_number, 4,4) = table2.ID_Number 
            AND table1.version = table2.version
    )

答案 1 :(得分:0)

你应该抛出一些样本数据。

试试这个,

declare @t table(col1 varchar(50))
insert into @t values('23-4567')

declare @t1 table(col1 varchar(50))
insert into @t1 values('1023004567')


;With CTE as
(
select t.col1

from @t t
inner join @t1 t1
on substring(t.col1,1,charindex('-',t.col1)-1)=
substring(t1.col1,charindex('10',t1.col1)+2,charindex('00',t1.col1)-3)
where NOT EXISTS(
select * from @t1 t1
where substring(t.col1,charindex('-',t.col1)+1,len(col1))
=substring(t1.col1,charindex('00',t1.col1)+2,len(col1))
)
)

select * from cte t