2014-10-09 21 views
0

我有以下4個表格:MainTable,Warehouse,Customer和Company。內部加入時的情況

這些表的模式:

create table MainTable(ID int, Warehouse_id int, Customer_ID int) 
create table Warehouse (Warehouse_id int, company_id int) 
create table Customer (Customer_ID int, Company_ID int) 
create table company (Company_id int, Country_ID int, Zone_ID int) 

的OBJECTIF是讓COUNTRY_ID和Zone_ID爲(的MainTable)相應的ID。

我們有2個不同的情況:if MainTable.Warehouse_ID不爲空,我們應該做倉庫表(現場warehouse_id)內部聯接,然後在公司表的連接(現場COMPANY_ID), else(如果MainTable.Warehouse_ID爲null )我們應該在客戶表(在Customer_ID字段上)和公司表(在Company_ID字段上)上進行內部聯接。

以下查詢生成單詞「案例」附近的一個錯誤:

select CO.Country_ID, CO.Zone_ID 
from MainTable MT 
inner join (case 
    when MT.Warehouse_ID is not null 
then 
     Warehouse W on MT.Warehouse_ID=W.Warehouse_ID 
     inner join Company CO on W.Company_ID=CO.Company_ID 
else  
     Customer Cu on MT.Customer_ID=Cu.Customer_ID 
     inner join Company C on Cu.Company_ID=CO.Company_ID 
    end) 

助我,我錯過了一個小的語法錯誤,這樣做對嗎?如果沒有..還有其他方法可以做到嗎?

謝謝

+0

一個辦法做到這一點,是動態查詢!但你需要使用存儲過程 – 2014-10-09 11:08:07

+0

動態SQL不會幫助,因爲條件是特定於每行 – jazzytomato 2014-10-09 11:11:58

回答

-1

你不能那樣做。 對於這種有條件的連接,你會期望輸出爲

您是否嘗試過使用外連接?

select ISNULL(C1.Country_ID,C2.Country_ID) as Country_ID,ISNULL(C1.Zone_ID,C2.Zone_ID) as Zone_ID 
from MainTable MT 
left outer join Warehouse W on MT.Warehouse_ID=W.Warehouse_ID 
left outer join Company1 C1 on W.Company_ID=C1.Company_ID 
left outer join Customer Cu on MT.Customer_ID=Cu.Customer_ID 
left outer join Company2 C2 on Cu.Company_ID=C2.Company_ID 
+0

爲什麼減號? – jazzytomato 2014-10-09 11:27:17

+1

謝謝大家的幫助。托馬斯,與左外連接它工作:) – user3569267 2014-10-09 11:51:55

1

您可以使用UNION

SELECT CO.Country_ID, CO.Zone_ID 
    FROM MainTable MT 
    INNER JOIN Warehouse W ON MT.Warehouse_ID=W.Warehouse_ID 
    INNER JOIN Company CO on W.Company_ID=CO.Company_ID 
    WHERE MT.Warehouse_ID IS NOT NULL 
UNION 
SELECT CO.Country_ID, CO.Zone_ID 
    FROM MainTable MT 
    INNER JOIN Customer Cu ON MT.Customer_ID=Cu.Customer_ID 
    INNER JOIN Company CO on Cu.Company_ID=CO.Company_ID 
    WHERE MT.Warehouse_ID IS NULL 
1

嘗試如下的內容:

IF EXISTS(SELECT 1 
      FROM MainTable mt 
      WHERE mt.Warehouse_ID IS NOT NULL) 
    BEGIN 
     SELECT CO.Country_ID, 
      CO.Zone_ID 
     FROM MainTable MT 
      INNER JOIN Warehouse W 
        ON MT.Warehouse_ID = W.Warehouse_ID 
      INNER JOIN Company CO 
        ON W.Company_ID = CO.Company_ID 
    END 
ELSE 
    BEGIN 
     SELECT CO.Country_ID, 
      CO.Zone_ID 
     FROM MainTable MT 
      INNER JOIN Customer Cu 
        ON MT.Customer_ID = Cu.Customer_ID 
      INNER JOIN Company C 
        ON Cu.Company_ID = CO.Company_ID 
    END