2012-12-14 195 views
0

我有TContractFormidcontract(primary key),idcntrtype(foreign key),date_begin,date_end,cost。此外,我已經得到了3種類型的合同:遇到問題

TRentWhouseContract與領域idcontract,idclient,idpdtwhs

TRentShoppointContract與領域idcontract,idclient,idshoppoint,idshoptype

TRentEquipContract與領域idcontract,idclient,ideq,amount

idcntrtype - 合同的類型。 TContractType - idcntrtype(primary key),idcntrclass(foreign key),nameTContractClass - idcntrclass,name

我想創建一個視圖與列 idcontract,idclient,contract_type(name of type),contract_class(name of class),date_begin,date_end,cost。 (我知道我在TRentWhouseContract表中有幾個合同(其他表沒有行)(它沒有idclient,因爲我不知道如何從不同的表中獲得相同的idclient,如果有的話)表是空的)

select TCF.idcontract, 
    --idclient 
    TCF.date_begin, 
    TCF.date_end, 
    TCT.name as [type], 
    TCC.name as class, 
    TCF.cost 
from TContractForm as TCF, 
TRentEquipContract as TREC, 
TRentShopPointContract as TRSPC, 
TRentWhouseContract as TRWC, 
TContractType as TCT, 
TContractClass as TCC 
where TCF.idcontract = TREC.idcontract or TCF.idcontract = TRSPC.idcontract 
    or TCF.idcontract = TRWC.idcontract and TCT.idcntrtype = TCF.idcntrtype 
    and TCT.idcntrclass = TCC.idcntrclass 

回答

2

如果我理解正確的話,這就是我會做內部`select`

select TCF.idcontract, 
    --idclient 
    TCF.date_begin, 
    TCF.date_end, 
    TCT.name as [type], 
    TCC.name as class, 
    TCF.cost 
from TContractForm as TCF 
JOIN TContractType as TCT 
    ON TCT.idcntrtype=TCF.idcntrtype 
JOIN TContractClass as TCC 
    ON TCT.idcntrclass = TCC.idcntrclass 
UNION 
select TCF.idcontract, 
    --idclient 
    TCF.date_begin, 
    TCF.date_end, 
    TCT.name as [type], 
    TCC.name as class, 
    TCF.cost 
from TRentWhouseContract as TCF 
JOIN TContractType as TCT 
    ON TCT.idcntrtype=TCF.idcntrtype 
JOIN TContractClass as TCC 
    ON TCT.idcntrclass = TCC.idcntrclass 
UNION 
select TCF.idcontract, 
    --idclient 
    TCF.date_begin, 
    TCF.date_end, 
    TCT.name as [type], 
    TCC.name as class, 
    TCF.cost 
from TRentShoppointContract as TCF 
JOIN TContractType as TCT 
    ON TCT.idcntrtype=TCF.idcntrtype 
JOIN TContractClass as TCC 
    ON TCT.idcntrclass = TCC.idcntrclass 
UNION 
select TCF.idcontract, 
    --idclient 
    TCF.date_begin, 
    TCF.date_end, 
    TCT.name as [type], 
    TCC.name as class, 
    TCF.cost 
from TRentEquipContract as TCF 
JOIN TContractType as TCT 
    ON TCT.idcntrtype=TCF.idcntrtype 
JOIN TContractClass as TCC 
    ON TCT.idcntrclass = TCC.idcntrclass 
1

如何獲得idclient:。

coalesce(TREC.idclient, TRSPC.idclient,TRWC.idclient) as idclient 

coalesce返回第一個非缺失值

至於其餘的 - 我想你š因爲在所有表中沒有一些記錄(所有表中都沒有記錄!),所以應該做左外連接而不是逗號連接。

select... 
from TCF,TCT,TCC ... A 
left join ... TREC on A.idcontract=TREC.idcontract 
left join ... TRSPC 

+0

我應該用戶'coalesce'? – lapots

+0

是的。選擇TCF.idcontract,合併(TREC.idclient,...)作爲idclient,... – Joe