2014-12-18 4 views
0

У меня есть таблица в 2 разных базе данных. Таблица 1 в DataBase1 и Table2 в базе данных2.Многие левые присоединяются к одной таблице

Таблица 1 и Таблица 2 имеют одинаковые столбцы с различным содержанием строк.

Каждая строка соответствует номеру участка (TShipping_Tracking или TShipping_Reference или TShipping_OrderRef или TShipping_Barcode) и идентификатору (TShipping_ID). Ремарка: для каждого участка (строки) только 1 из 4 колонки, связанной с номером посылки, перечисленные выше, не является нулевым

Эти схемы таблицы в каждой базе данных:

create table Database1..Table1 (TShipping_ID varchar(50),TShipping_Tracking varchar(50),TShipping_Reference varchar(50),TShipping_OrderRef varchar(50),TShipping_Barcode varchar(50)) 

create table Database2..Table2 (TShipping_ID varchar(50),TShipping_Tracking varchar(50),TShipping_Reference varchar(50),TShipping_OrderRef varchar(50),TShipping_Barcode varchar(50)) 

Более того, я есть таблица Database1..Reject, имеющие одни и те же столбцы, как Table1 (и Table2) TShipping_ID: кроме арматуры

create table Database1..Table3(TShipping_Tracking varchar(50),TShipping_Reference varchar(50),TShipping_OrderRef varchar(50),TShipping_Barcode varchar(50)) 

Я хочу, чтобы извлечь TShipping_ID посылки, которая не существует в Database1

я сделал следующий запрос, но он имеет очень плохое время отклика:

select isnull(isnull(isnull(D2t1 .TShipping_ID,D2t2.TShipping_ID),D2t3.tshipping_id),D2t4.tshipping_id) as TShipping_ID 
from Database1..Table3 D1t3 
left join Database1..Table1 D1t1 on D1t3.TShipping_tracking=D1t1.TShipping_tracking 
left join Database1..Table1 D1t2 on D1t3.TShipping_Reference=D1t2.TShipping_Reference 
left join Database1..Table1 D1t3 on D1t3.TShipping_OrderRef=D1t3.TShipping_OrderRef 
left join Database1..Table1 D1t4 on D1t3.TShipping_barcode=D1t4.TShipping_barcode 
left join Database2..Table2 D2t1 on D1t3.TShipping_tracking=D2t1.TShipping_tracking 
left join Database2..Table2 D2t2 on D1t3.TShipping_Reference=D2t2.TShipping_Reference 
left join Database2..Table2 D2t3 on D1t3.TShipping_OrderRef=D2t3.TShipping_OrderRef 
left join Database2..Table2 D2t4 on D1t3.TShipping_barcode=D2t4.TShipping_barcode 
where D1t1.TShipping_Tracking is null and D1t2.TShipping_Reference is null and D1t3.TShipping_OrderRef is null and D1t4.TShipping_BarCode is null 

Кто-нибудь есть лучший способ сделать это?

Благодаря

+1

искать функцию 'coalesce', а не использовать isnulls – Lefty

ответ

0

Предполагая, что Table1.TShipping_ID является NOT NULL поле:

SELECT t2.TShipping_ID 
FROM Table3 t3 
LEFT JOIN Table2 t2 
    ON t2.TShipping_Tracking = t3.TShipping_Tracking 
    OR t2.TShipping_Reference = t3.TShipping_Reference 
    OR t2.TShipping_OrderRef = t3.TShipping_OrderRef 
    OR t2.TShipping_Barcode = t3.TShipping_Barcode 
LEFT JOIN Table2 t1 
    ON t1.TShipping_Tracking = t3.TShipping_Tracking 
    OR t1.TShipping_Reference = t3.TShipping_Reference 
    OR t1.TShipping_OrderRef = t3.TShipping_OrderRef 
    OR t1.TShipping_Barcode = t3.TShipping_Barcode 
WHERE t1.TShipping_ID IS NULL 

Это будет по-прежнему медленно, как ад, не в последнюю очередь потому, что это довольно близко к CROSS JOIN, но вы не знаете предоставить достаточную информацию о том, что вы делаете, или о том, какие ключевые поля таблиц должны заставить меня думать, что вы можете заменить OR на AND в условиях соединения. Однако я подозреваю, что это может быть так.

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