У меня есть список домашних животных:
И мне нужно найти правильного владельца для каждого из домашних животных из таблицы Owner
Чтобы правильно сопоставить каждого питомца с владельцем, мне нужно использовать специальную таблицу соответствия, которая выглядит так:
Итак, для домашних животных с PetID = 2 мне нужно найти владельца, у которого есть соответствие по трем полям:
Pet.Zip = Owner.Zip
and Pet.OwnerName = Owner.Name
and Pet.Document = Owner.Document
В нашем примере он будет работать следующим образом:
select top 1 OwnerID from owners
where Zip = 23456
and Name = 'Alex'
and Document = 'a.csv'
если OwnerID не найден, то мне нужно сопоставить по 2 полям (не используя поле с наивысшим приоритетом)
В нашем примере:
select top 1 OwnerID from owners where
Name = 'Alex'
and Document = 'a.csv'
Поскольку запись не найдена, нам нужно сопоставить меньшее количество полей. В нашем примере:
select top 1 OwnerID from owners where Document = 'a.csv'
Теперь мы нашли владельца с OwnerID = 6.
Теперь нам нужно обновить любимчика с помощью ownerID = 6, а затем мы сможем обработать следующего питомца.
Единственный способ, которым я могу это сделать прямо сейчас, - это цикл или курсор + динамический SQL.
Можно ли достичь этого без циклов + динамический sql? Может быть, STUFF + Pivot как-то?
sql скрипт: http://sqlfiddle.com/#!18/10982/1/0
Пример данных:
create table temp_builder
(
PetID int not null,
Field varchar(30) not null,
MatchTo varchar(30) not null,
Priority int not null
)
insert into temp_builder values
(1,'Address', 'Addr',4),
(1,'Zip', 'Zip', 3),
(1,'Country', 'Country', 2),
(1,'OwnerName', 'Name',1),
(2,'Zip', 'Zip',3),
(2,'OwnerName','Name', 2),
(2,'Document', 'Document', 1),
(3,'Country', 'Country', 1)
create table temp_pets
(
PetID int null,
Address varchar(100) null,
Zip int null,
Country varchar(100) null,
Document varchar(100) null,
OwnerName varchar(100) null,
OwnerID int null,
Field1 bit null,
Field2 bit null
)
insert into temp_pets values
(1, '123 5th st', 12345, 'US', 'test.csv', 'John', NULL, NULL, NULL),
(2, '234 6th st', 23456, 'US', 'a.csv', 'Alex', NULL, NULL, NULL),
(3, '345 7th st', 34567, 'US', 'b.csv', 'Mike', NULL, NULL, NULL)
create table temp_owners
(
OwnerID int null,
Addr varchar(100) null,
Zip int null,
Country varchar(100) null,
Document varchar(100) null,
Name varchar(100) null,
OtherField bit null,
OtherField2 bit null,
)
insert into temp_owners values
(1, '456 8th st', 45678, 'US', 'c.csv', 'Mike', NULL, NULL),
(2, '678 9th st', 45678, 'US', 'b.csv', 'John', NULL, NULL),
(3, '890 10th st', 45678, 'US', 'b.csv', 'Alex', NULL, NULL),
(4, '901 11th st', 23456, 'US', 'b.csv', 'Alex', NULL, NULL),
(5, '234 5th st', 12345, 'US', 'b.csv', 'John', NULL, NULL),
(6, '123 5th st', 45678, 'US', 'a.csv', 'John', NULL, NULL)
Редактировать: меня переполняет ряд замечательных предложений и ответов. Я тестировал их, и многие работали хорошо для меня. К сожалению, я могу только вознаградить награду за одно решение.