2012-02-23 71 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