2013-08-02 3 views
1

Я создал временную таблицу:SQL Server Сравнение двух таблиц

CREATE table #Temp 
(
    ACCOUNT varchar(20), 
    SERV_ACCT varchar(20), 
    INV_DATE datetime, 
    CURR_Date datetime 
) 

и вставленные значения в нем.

У меня есть другая таблица под названием: AccountTable, который имеет четыре колонки: СЧЕТОВ, SERV_ACCT, INV_DATE, CURR_Date

После того как я вставить значения в #Temp я могу сделать это, чтобы найти все соответствующие результаты:

SELECT * FROM #Temp 
JOIN AccountTable 
ON #Temp.ACCOUNT = AccountTable.ACCOUNT 
AND #Temp.SERV_ACCT = AccountTable.SERV_ACCT 
AND #Temp.INV_DATE = AccountTable.INV_DATE 
AND #Temp.CURR_Date = AccountTable.CURR_Date 

Будет ли это возвращать только соответствующие результаты? Есть ли другой способ сравнения?

ответ

4

Ваш INNER JOIN будет возвращать только соответствующие записи, вы можете использовать FULL JOIN и WHERE критерии для проверки несовпадающих записей:

SELECT * 
FROM #Temp a 
FULL JOIN AccountTable b 
    ON a.ACCOUNT = b.ACCOUNT 
    AND a.SERV_ACCT = b.SERV_ACCT 
    AND a.INV_DATE = b.INV_DATE 
    AND a.CURR_Date = b.CURR_Date 
WHERE a.Account IS NULL 
    OR b.Account IS NULL 

Вы могли бы объединить, что с CASE заявление, чтобы получить разбивку записей соответствия :

SELECT CASE WHEN a.Account IS NULL THEN 'Record in B Only' 
      WHEN b.Account IS NULL THEN 'Record in A Only' 
      ELSE 'Record in Both' 
     END 
     ,COUNT(*) 'CT'  
FROM #Temp a 
FULL JOIN AccountTable b 
    ON a.ACCOUNT = b.ACCOUNT 
    AND a.SERV_ACCT = b.SERV_ACCT 
    AND a.INV_DATE = b.INV_DATE 
    AND a.CURR_Date = b.CURR_Date 
GROUP BY CASE WHEN a.Account IS NULL THEN 'Record in B Only' 
      WHEN b.Account IS NULL THEN 'Record in A Only' 
      ELSE 'Record in Both' 
     END 
ORDER BY COUNT(*) DESC 

Примечание: Оба выше предположим Account не может быть законно NULL, выбрать поле, которое не может быть NULL или использовать несколько полей, которые не могут быть полностью законными NULL. IE:

WHERE COALESCE(a.ACCOUNT, a.SERV_ACCT,a.INV_DATE,a.CURR_Date) IS NULL 
+0

+1 FULL JOIN и SELECT CASE имеет смысл, если OP хочет сравнить несоответствующие значения. –

2
бы

это возвращение только результаты сопоставления?

Да. Это возвращает результаты сопоставления.

Так как пример:

стол AccountTable:

brian -- bacon -- 02/08/2013 -- 02-08-2013 
chicken -- spam -- 01/08/2013 -- 01-08-2013 

стол #Temp:

brian -- bacon -- 02/08/2013 -- 02-08-2013 

Ваш запрос будет возвращать brian-row.

Но подумайте, отличаются ли ваши даты. Тогда совпадение только на основе ACCOUNT и SRV_ACC может быть более уместным, потому что вы все еще хотите показывать эти строки. Так что это действительно зависит от контекста, что имеет смысл, который зависит от вас.


Есть еще один способ, которым я могу сравнить?

Это зависит от того, чего вы хотите достичь. Как уже указывал Goat CO, вы также можете показать несоответствующие строки. Вы также можете сравнить, какие данные новее, или какая таблица состоит из большего количества данных. Существует много разных способов сравнить две вещи. Например, сравнивая яблоко и помидоры. Некоторые могут сравнить их размер, некоторые могут сравнить их вкус.

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