Сравнение двух таблиц для каждого столбца каждой строки и результата как переменной журнала - PullRequest
0 голосов
/ 16 ноября 2011

Мне нужно сравнить две таблицы в каждой строке. таблицы следующие: -

Таблица:

ID  First_Name       Last_name                         Birthdate
1   Shradha         Deshkmukh                       1981-12-25 00:00:00
2   Shradha              Verma                      1981-05-11 00:00:00
3   Divya                 Dutta                     1982-07-21 00:00:00
4   Matthew               Palmer                         1983-12-28 00:00:00

таблица d: -

 id fn  ln  dob
 1  Shradha Tiwari  1981-12-25 00:00:00
 2  Divya   Dutta   1983-07-21 00:00:00
 3  Sulabh  Manesar 1975-09-11 00:00:00
 4  Matthew Palmer  1983-12-28 00:00:00
 5  Samuel  Maxwell 1984-05-22 00:00:00

Теперь моя исходная таблица содержит около 17 столбцов, и это просто более простая версия. Таблицы «A» и «D» генерируются запросом. Таблица «A» будет заполнена, а таблица D будет похожа на временную таблицу, которая получает свои значения из запроса, сравнивает все имена в каждой таблице и, если она сталкивается с какими-либо изменениями, должна обновить таблицу журнала. По имени а также упоминает все столбцы, которые отличаются.

Для этого я создал временную таблицу, а именно. '#TMP_COMPARE', который принимает все столбцы таблицы 'a'. а затем сравнивает эти столбцы со столбцами таблицы 'd', и в ней есть столбцы PLN, PDOB, Pmatch, которые по умолчанию имеют значения 0 и имеют значение 1, если все столбцы совпадают для этой строки (Pmatch = 1), совпадает фамилия (PLN = 1), Dob соответствует (Pdob = 1).

Как только этот '#TMP_COMPARE' сравнивает две таблицы, я обновлю таблицу журналов столбцами, которые не соответствуют имени.

USE Testing
GO

IF OBJECT_ID('TEMPDB..#TMP_COMPARE') is not null
BEGIN
DROP TABLE #TMP_COMPARE
END 

CREATE TABLE #TMP_COMPARE(
FN varchar(20),
LN varchar(20),
dob smalldatetime,
PLN int default 0,
Pdob int default 0,
 Pmatch int default 0)

BEGIN
INSERT INTO #TMP_COMPARE
SELECT a.fn, a.ln, a.dob, 
case when a.ln = d.Last_name AND a.dob = d.Birthdate
        THEN 1          
        END AS #TMP_COMPARE.PMATCH,
 CASE WHEN a.dob <> d.Birthdate
        THEN 0  
         WHEN a.dob = d.Birthdate then 1 
        END AS #TMP_COMPARE.Pdob,           

 CASE WHEN a.ln <> d.Last_name 
        THEN 0
          WHEN a.ln = d.Last_name            
    then 1          
 END AS #TMP_COMPARE.PLN

FROM dbo.a2 as a  
 JoIN  d ON a.fn = d.First_Name     
END 

SELECT * FROM #TMP_COMPARE

Ошибка, которую я получаю: -

Msg 102, Level 15, State 1, Line 24
Incorrect syntax near '.'

Что не так в моем запросе, и я должен сделать это любым другим способом, пожалуйста, совет. Теперь это что-то очень простое, что неправильно в моем запросе, но я новичок, и любая помощь очень ценится.

Спасибо заранее, DCS

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

Вы можете использовать двухсимвольное поле данных для сохранения результата.

Position 1 = LN match state
Position 2 = Birthdate match state

11 = LN Match True ; Birthday Match True
10 = LN Match True ; Birthday Match False
01 = LN Match False; Birthday Match True
00 = LN Match False; Birthday Match True
0 голосов
/ 16 ноября 2011

@ log - это одно скалярное значение переменной, которое может содержать только одно значение в данный момент времени.Таким образом, вы не можете ссылаться на предыдущие значения этой переменной, только то, что в данный момент там есть.

Это означает, что будет отображаться только последнее значение (совпадение) для каждой записи в вашем операторе select.

Возможно, вы захотите переместить выделение внутри цикла и заменить его вставкой в ​​какую-либо таблицу журналирования.Таким образом, вы можете просто выбрать * из loggingtable после окончания цикла, чтобы получить все данные.

Вероятно, есть и лучший способ справиться с этим, но я хотел дать быстрый ответ (нет времени нарефакторинг прямо сейчас).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...