2016-04-12 4 views
2

У меня есть четыре разных таблицы, на которые я пытаюсь выполнить запрос, первая таблица - это то, где я буду выполнять большую часть запросов, но если в машине нет соответствия, я должен посмотреть в другой поля в других таблицах, чтобы увидеть, есть ли соответствие из параметра VIN.Должен ли я присоединяться или я должен СОЮЗ

Пример:

Select 
    c.id, 
    c.VIN, 
    c.uniqueNumber, 
    c.anotheruniqueNumber 
FROM Cars c, Boat b 
WHERE 
    c.VIN = @VIN(parameter), 
    b.SerialNumber = @VIN 

Теперь говорят, что у меня нет ни одного совпадения в Cars, но есть матч в Boat, как бы я смог вытащить соответствующий рекорд якорной против записи автомобиля? Я попытался подключиться к таблицам, но таблицы не имеют уникального идентификатора для ссылки на другую таблицу.

Я пытаюсь выяснить, что является лучшим способом поиска всех таблиц с параметра, но с наименьшим количеством кода. Я думал о том, чтобы делать UNION ALL, но не уверен, что это то, что я действительно хочу для этой ситуации, поскольку количество записей может быть чрезвычайно большим.

Я использую сейчас SQL Server 2012. Заранее спасибо!

ОБНОВЛЕНО:

CAR table 
ID VIN    UniqueIdentifier  AnotherUniqueIdentifier 
1 2002034434  HH54545445   2016-A23 
2 2002035555  TT4242424242   2016-A24 
3 1999034534  AGH0000034   2016-A25 


BOAT table 
ID SerialNumber Miscellaneous 
1 32424234243  545454545445 
2 65656565656  FF24242424242 
3 20023232323  AGH333333333 

ожидаемый результат, если @VIN параметр соответствует идентификатор якорной:

BOAT 
ID SerialNumber Miscellaneous 
2 65656565656  FF24242424242 
+1

пример данных и ожидаемый результат помогут –

+1

Обычно 'JOIN' используется для данных, имеющих определенную взаимосвязь. например: курсы и студенты. Короче, возможно, Cars Towing Boats не существует ссылочных отношений, поэтому 'JOIN' здесь не применим. –

+4

Пожалуйста, пожалуйста, прекратите использование устаревшего [синтаксиса соединения.] (Http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins .aspx) – Zane

ответ

3

Своего рода union all может быть лучшим подходом - по крайней мере, самый быстрый с правом индексы:

Select c.id, c.VIN, c.uniqueNumber, c.anotheruniqueNumber 
from Cars c 
where c.VIN = @VIN 
union all 
select b.id, b.VIN, b.uniqueNumber, b.anotheruniqueNumber 
from Boats b 
where b.VIN = @VIN and 
     not exists (select 1 from Cars C where c.VIN = @VIN); 

Это предполагает, что у вас есть соответствующие столбцы в каждой из таблиц (что ваш вопрос подразумевает true).

Цепочка not exists может увеличиться, поскольку вы добавляете больше типов объектов. Простой способ обойти это сделать сортировку вместо этого - если вы хотите только одну строки:

select top 1 x.* 
from (Select c.id, c.VIN, c.uniqueNumber, c.anotheruniqueNumber, 1 as priority 
     from Cars c 
     where c.VIN = @VIN 
     union all 
     select b.id, b.VIN, b.uniqueNumber, b.anotheruniqueNumber, 2 as priority 
     from Boats b 
     where b.VIN = @VIN 
    ) x 
order by priority; 

Там есть небольшие накладные расходы на order by. Но, честно говоря, упорядочение 1-4 рядов тривиально с точки зрения производительности.

+0

Это предполагает, что 'Boats' и' Cars' имеют одинаковые столбцы, но +1 в любом случае. –

+0

Насколько эффективно было бы добавлять 'NULL' к столбцам, которые не совпадают? Потому что, как я уже сказал, я бы часто обращался к «Автомобили», а не к другим таблицам. Добавляли ли 'NULL' к другим таблицам в UNION какие-либо проблемы? –

+1

@ programmer117. , , Если столбец отсутствует в других таблицах, тогда определенно используйте 'NULL' в качестве владельца места. –

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