匹配并比较SQL Server中的两个表
我需要比较数据库中的两个表。他们也储存类似的信息。 但是,在某些情况下,ID和段子字符串数据1、1确实匹配,但是每个ID的服务编号和服务日期不同 下面是我的示例数据。在这种情况下,应选择两个高亮显示的行: 我试过这样的方法:匹配并比较SQL Server中的两个表,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我需要比较数据库中的两个表。他们也储存类似的信息。 但是,在某些情况下,ID和段子字符串数据1、1确实匹配,但是每个ID的服务编号和服务日期不同 下面是我的示例数据。在这种情况下,应选择两个高亮显示的行: 我试过这样的方法: SELECT T.ID, SUBSTRING(data, 1, 1) AS Seg, SUBSTRING(data, 2, 4) AS sn, CONVERT(DATE, SUBSTRING(data, 11, 8)), S
SELECT
T.ID,
SUBSTRING(data, 1, 1) AS Seg,
SUBSTRING(data, 2, 4) AS sn,
CONVERT(DATE, SUBSTRING(data, 11, 8)),
ServiceNumber, ServiceDate
FROM
P
JOIN
T ON p.ID = t.ID
WHERE
SUBSTRING(data, 1, 1) != Segment
AND SUBSTRING(data, 2, 4) != ServiceNumber
AND CONVERT(DATE, SUBSTRING(data, 11, 8)) != ServiceDate;
SQL Fiddle链接如下:
任何想法都欢迎 我不完全清楚你想做什么,但试试这个 假设列中的字符数一致
SELECT T.ID,
SUBSTRING ( data ,1 , 1 ) AS Seg,
SUBSTRING ( data ,2 , 4 ) AS sn,
CONVERT(date,SUBSTRING ( data ,11 , 8 )), ServiceNumber, ServiceDate
FROM T
INNER JOIN P ON T.SERVICENUMBER = SUBSTRING(P.DATA,2,3)
AND T.SERVICENUMBER = RIGHT(P.DATA,7)
WHERE P.ID = T.ID
是否仅选择差异
WITH cte AS (
SELECT ID,
CAST(SUBSTRING ( data ,1 , 1 ) AS INT) AS Seg,
CAST(LTRIM(SUBSTRING ( data ,2 , 4 )) AS VARCHAR(25)) AS sn,
CONVERT(date,SUBSTRING ( data ,11 , 8 )) AS ServiceDate
from P
)
SELECT *
FROM t
WHERE NOT EXISTS (
SELECT 1 FROM cte c
WHERE c.ID = t.ID
AND c.Seg = t.Segment
AND c.sn = t.ServiceNumber
AND c.ServiceDate = t.ServiceDate)
假设粘贴的示例中存在错误,即第二行不应高亮显示,因为ID、段和日期相同,可以通过使用CTE或派生表将编码列分解为其组件来简化问题,然后简化比较:
WITH FixedTableP AS
(
SELECT P.ID,
SUBSTRING ( [data] ,1 , 1 ) AS PSegment,
SUBSTRING( [data] ,2 , 4 ) AS PServiceNumber,
CONVERT(date,SUBSTRING ( data ,11 , 8 )) AS PServiceDate
FROM P
)
SELECT T.ID, P.ID, T.ServiceNumber, P.PServiceNumber, T.ServiceDate, P.PServiceDate
FROM T
JOIN FixedTableP P ON p.ID=t.ID AND p.PSegment = t.Segment
WHERE P.PServiceDate <> T.ServiceDate
AND P.PServiceNumber <> T.ServiceNumber;