2015-04-24 5 views
1

Мне нужно сравнить две таблицы в базе данных. Они хранят подобную информацию. Однако в некоторых случаях ID и Segment (SUBSTRING (data, 1, 1)) соответствуют, однако номер службы и дата обслуживания различаются для каждого ID.Сравнение и сравнение двух таблиц в SQL Server

Вот мои данные примера. В этом случае две выделенные строки должны быть выбраны:

Example data

Я пытался что-то вроде этого:

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 Скрипки здесь:

http://sqlfiddle.com/#!6/d6aee/10

Любые идеи были бы более приветствуются!

ответ

0

Предполагая, что есть ошибка в вашем вставленного примере, а именно, что вторая строка не должна быть выделена в качестве идентификатора, Сегменты и даты совпадают, вы можете упростить задачу разбив из кодированного колонки на ее компоненты с КТР или производной таблицы, а затем облегчить сравнение:

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; 

SqlFiddle here

+0

Спасибо большое! Это прекрасно работает! – Petrik

0

Не совсем уверен, что я понимаю, что вы пытаетесь сделать, но попробуйте это.

Предполагая, что количество символов в столбцах согласовано.

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 
2

Вы хотите выбрать только разницу?

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) 

http://sqlfiddle.com/#!6/d6aee/30

Смежные вопросы