2012-02-23 126 views
1

我只想問如何合併兩個表。數據庫合併表

因爲我有一個表客人和公司,他們都獲得預訂。

我想加入他們並將它們標記爲客戶,並且我想添加一個新的客戶類型,如果我的公司爲空...和公司,如果我的客戶爲空,則會說客人...

下面是一個例子:

guest(g_id(PK), name, guest details etc....) 
company(c_id(PK), name, company details etc...) 
reservation(r_id(PK), g_id(fk), c_id(fk), reservation details etc...) 

當我加入他們的行列(假設來賓已經獲得了提前預訂)我的表看起來像

reservation_id|company name|guest name|reservation details 
    1   null  <name>  <details> 
    2   null  <name>  <details> 

我想是讓這樣的:

reservation_id|customer name|cust_type|reservation details 
    1   <name>  <guest>  <details> 
    2   <name>  <company>  <details> 

回答

2

一個可能的解決辦法是首先創建爲每種類型保留(您可能已經擁有)的查詢,並添加cust_type那裏,那麼工會兩者結合起來。因此,最初的查詢會是這樣的:

guest_reservations:

SELECT reservation.r_id, guest.name, "guest" AS cust_type, {other fields} 
FROM guest, reservation INNER JOIN guest ON guest.g_id = reservation.g_id; 

company_reservations:

SELECT reservation.r_id, company.name, "company" AS cust_type {other fields} 
FROM company, reservation INNER JOIN company ON company.c_id = reservation.c_id; 

,那麼你可以聯合兩個查詢一起,像下面。

SELECT reservation.r_id, guest.name, "guest" AS cust_type, {other fields} 
FROM guest, reservation INNER JOIN guest ON guest.g_id = reservation.g_id 
UNION SELECT reservation.r_id, company.name, "company" AS cust_type {other fields} 
FROM company, reservation INNER JOIN company ON company.c_id = reservation.c_id; 

當然記得要麼刪除{等領域}或添加你需要有任何其他。

+0

+1 - 然後創建一個下降的數據到新表的INSERT語句,使用該查詢作爲數據源 – ninesided 2012-02-23 03:46:50

+0

爲什麼它不在我身上... T_T – 2012-02-23 04:34:08

+0

這是正確的嗎? ''SELECT *,「Guest」AS cust_type FROM guest JOIN reservation;'' – 2012-02-23 04:34:26

2

不知道的模式是最好的,但考慮下表:

RES(渣油,描述,CID,GID,細節)

1 Guest Res 1 NULL Just some guy 
2 Comp Res NULL 1 Corporate jerk 

遊客(GID,姓名)

1 Chuck 

公司(CID,名)

1 Tenth 

退房選擇查詢的參數:

1. r.rid : id of reservation table 
2. isnull(c.name, g.name) : gets the non null value from either company or guest 
3. isnull(replace(c.name, c.name, 'Company'), 'Guest') as type 
    Fanciness...if c.name is something, then 'Company', otherwise 'Guest' 
4. r.details : reservation details 

需要外連接,因爲空的,這給你數據的完整視圖。

left outer join company c on r.cid = c.cid 
left outer join guest g on r.gid = g.gid 

所以,如果你堅持它一起你得到你所期待的:

select r.rid, r.description, isnull(c.name, g.name), 
isnull(replace(c.name, c.name, 'Company'), 'Guest') as type, 
r.details from res r 
left outer join company c on r.cid = c.cid 
left outer join guest g on r.gid = g.gid 

1 Guest Res Chuck Guest Just some guy 
2 Comp Res Tenth Company Corporate jerk 
+0

sirhow我可以得到公司名稱和客人名稱。我只在預訂表中插入ID; – 2012-02-23 04:57:17

+0

'''select reservation_ID,isnull(guest_id,company_id)作爲預留的名字;''爲什麼這會在調用本地函數isnull時給我一個不正確的參數計數。 – 2012-02-23 05:02:11

+0

我已經在這裏說過,先生。 (guest_id,lastname,firstname,middlename)''''company(company_id,lastname,firstname,middlename)''''reservation(reservation_ID,guest_id(FK),company_id(FK)'' – 2012-02-23 05:04:38