2014-01-13 38 views
0

大家好我已經inherirted一個設計不當的數據庫,我需要從3個表從許多多的表的SELECT許多關係

特許經營

Id(Int, PK) 
    FrID (varchar(50)) 
    FirstName (varchar(50)) 
    LastName (varchar(50)) 

商店

獲得一些信息
Id (Int, PK) 
FrID (varchar(50)) 
StoreNumber (varchar(50)) 
StoreName 
Address 

定價

Id (int, PK) 
StoreNumber (varchar(50)) 
Price1 
Price2 
Price3 

和數據

ID, FrID ,FirstName,LastName 
1, 10 ,John Q , TestCase 
2, 10 ,Jack Q , TestCase 
3, 11 ,Jack Q , TestCase 


ID, FrID, StoreNumber , StoreName , Address 
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 st 


ID, StoreNumber, Price1, Price2, Price3 
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.99, 20.99 , 30.99 

這裏是我做了什麼

SELECT F.FirstName,F.LastName,F.FrID , S.StoreNumber,S.StoreName,S.Address, 
     P.Price1,P.Price2,P.Price3 
FROM Franchisee F 
JOIN Store S on F.FrID = S.FrID 
JOIN Pricing P on P.StoreNumber = S.StoreNumber 

這部分作品,但我最終有很多重複的,例如傑克Q被列爲他的商店加上John Q所在的每家商店。無論如何要解決這個問題,重新設計一個數據庫。

+1

但約翰和傑克都屬於'10'專營ID ..所以他們的商店似乎是共同的。 –

+1

給我們一個您希望找回的數據樣本。數據結構化的方式目前只有一個查詢會產生重複。 –

+0

@Gaby,感謝您的編輯,我注意到並試圖解決它,但是您擊敗了我。 – Ksliman

回答

1

好了,就有問題,如字符型字段,如整體籮筐[FRID]被用來作爲字符串,保留字如[地址]被用作名稱等

讓我們把壞除了設計問題。

首先,我需要創建一個快速測試環境。我沒有放置外鍵,因爲不需要約束來獲得正確的答案。

-- 
-- 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 

主要問題是專營表應該有FRID主鍵(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; 

正確的輸出如下。

enter image description here

如果我是正確的,刪除​​重複項,更改主鍵。

需求變更

好吧,你把兩個或兩個以上的業主在同一個表。

下面使用子查詢將所有者列表合併爲一個字符串。另一種方法是有一個稱爲主要所有者的標誌。選擇它作爲顯示名稱。

-- 
-- 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 

這裏是第二個查詢的輸出。

enter image description here

+0

感謝這是我需要的,我會建議這個數據庫被重新設計,併爲上帝的緣故僱用一個dba :-) – Ksliman

+0

這甚至更好,傑克Q如何在FRID 10共同擁有一個商店44444,所以列出他作爲其他人的共同所有人將是不正確的。理想情況下,我想列出John Q的所有店鋪,然後John Q店鋪44444,然後Jack Q店鋪44444,然後店鋪55555,這甚至有可能嗎? – Ksliman

+0

但是這種關係沒有存儲在數據庫模型中。你有John Q和Jack Q與特許經營10有關。你必須改變數據模型以反映這種關係。從表特許權移除FrID。創建一個擁有以下特權的表(特許經營編號,FrId,商店編號)。現在您可以詳細瞭解所有權。 –