Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匹配并比较SQL Server中的两个表_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

匹配并比较SQL Server中的两个表

匹配并比较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

我需要比较数据库中的两个表。他们也储存类似的信息。 但是,在某些情况下,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)), 
    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;