Хорошо, есть целый список прачечного вопросов, таких как характер таких областях, как [Фрид] используется в качестве строк, зарезервированные слова, такие как [адрес] используется в качестве имени и т.д.
Давайте соберем плохо проблемы дизайна.
Во-первых, мне нужно создать быструю тестовую среду. Я не вводил внешние ключи, так как это ограничение не требуется для получения правильного ответа.
--
-- Setup test tables
--
-- Just playing
use Tempdb;
go
-- drop table
if object_id('franchise')> 0
drop table franchise;
go
-- create table
create table franchise
(
Id int primary key,
FrID varchar(50),
FirstName varchar(50),
LastName varchar(50)
);
-- insert data
insert into franchise values
(1, 10, 'John Q', 'TestCase'),
(2, 10, 'Jack Q', 'TestCase'),
(3, 11, 'Jack Q', 'TestCase');
-- select data
select * from franchise;
go
-- drop table
if object_id('store')> 0
drop table store;
go
-- create table
create table store
(
Id int primary key,
FrID varchar(50),
StoreNumber varchar(50),
StoreName varchar(50),
Address varchar(50)
);
-- insert data
insert into store values
(10, 10, 22222, 'TestStore1', '123 Main street'),
(11, 10, 33333, 'TestStore2', '144 Last Street'),
(12, 10, 44444, 'TestStore2', '145 Next Street'),
(13, 11, 55555, 'Other Test', '156 Other Street');
-- select data
select * from store;
go
-- drop table
if object_id('pricing')> 0
drop table pricing;
go
-- create table
create table pricing
(
Id int primary key,
StoreNumber varchar(50),
Price1 money,
Price2 money,
Price3 money
);
-- insert data
insert into pricing values
(1, 22222, 19.99, 20.99 , 30.99),
(2, 33333, 19.99, 20.99 , 30.99),
(3, 44444, 19.99, 20.99 , 30.99),
(4, 55555, 19.95, 20.95 , 30.95);
-- select data
select * from pricing;
go
Основной проблемой является то, что таблица франшиза должна иметь первичный ключ (PK) на Фрид, а не Id. Я не понимаю, почему есть дубликаты.
Однако нижеприведенный запрос удаляет их путем группировки. Я изменил данные о ценах для Джека Q, чтобы показать, что это другая запись.
--
-- Fixed Query - Version 1
--
select
f.FirstName,
f.LastName,
f.FrID,
s.StoreNumber,
s.StoreName,
s.Address,
p.Price1,
p.Price2,
p.Price3
from
-- Remove duplicates from francise
(
select
LastName,
FirstName,
Max(FrID) as FrID
from
franchise
group by
LastName,
FirstName
) as f
join store s on f.FrID = s.FrID
join pricing p on p.StoreNumber = s.StoreNumber;
Правильный выход ниже.
Если я правильно, удалить дубликаты записей и изменить первичный ключ.
Изменить Требования
Хорошо, вы помещаете двух или более владельцев в той же таблице.
Ниже приведен вспомогательный запрос для объединения списка владельцев в одну строку. Другой способ - иметь флаг, называемый основным владельцем. Выберите это как отображаемое имя.
--
-- Fixed Query - Version 2
--
select
f.OwnersList,
f.FrID,
s.StoreNumber,
s.StoreName,
s.Address,
p.Price1,
p.Price2,
p.Price3
from
-- Compose owners list
(
select
FrID,
(
SELECT FirstName + ' ' + LastName + ';'
FROM franchise as inner1
WHERE inner1.FrID = outer1.FrID
FOR XML PATH('')
) as OwnersList
from franchise as outer1
group by FrID
) as f (FrId, OwnersList)
join store s on f.FrID = s.FrID
join pricing p on p.StoreNumber = s.StoreNumber
Вот результат второго запроса.
но Джон и Джек оба принадлежат к '10' франшизы ид .. поэтому их магазины, кажется, являются общими. –
Дайте нам образец данных, которые вы ожидаете получить. Так как ваши данные структурированы, в настоящее время один запрос будет создавать дубликаты. –
@Gaby, Спасибо за редактирование, я заметил и попытался исправить это, но вы избили меня до него. – Ksliman