2014-06-27 93 views
0

我有以下結構的兩個表:尋找失蹤列

1 City_Details: 此表由所有爲每個城市適用的表和列。

 
Country_Name City_Name Table_Name Column_Name 
USA    New York T1   T1C1 
USA    New York T1   T1C2 
USA    New York T1   T1C3 
USA    New York T2   T2C1 
USA    Los Angeles T2   T2C1 
USA    Los Angeles T2   T2C2 
USA    Los Angeles T2   T2C3 
England   London  T1   T1C1 
England   London  T3   T3C1 
England   London  T3   T3C2 

2. Max_Column_Details:此表由約可以存在的每個城市和每個表只能有最大列的所有表的信息。

 
Table_Name Column_Name 
T1   T1C1 
T1   T1C2 
T1   T1C3 
T1   T1C4 
T2   T2C1 
T2   T2C2 
T2   T2C3 
T2   T2C4 
T2   T2C5 
T2   T2C6 
T3   T3C1 
T3   T3C2 
T3   T3C3 
T4   T4C1 
T4   T4C2 

我想編寫一個SQL查詢,僅返回每個城市中表PRESENT在表中缺少的列。例如,紐約T1有3列T1C1,T1C2,T1C3。 T1最多可以有四列,即T1C1,T1C2,T1C3,T1C4。因此,紐約表T1的缺失列是T1C4。同樣,其他城市其他表的缺失列也是需要的。因此,最終應該是爲下:

 
Country_Code City_Code Table_Name Column_Name 
USA    New York T1   T1C4 
USA    New York T2   T2C2 
USA    New York T2   T2C3 
USA    New York T2   T2C4 
USA    New York T2   T2C5 
USA    New York T2   T2C6 
USA    Los Angeles T2   T2C4 
USA    Los Angeles T2   T2C5 
USA    Los Angeles T2   T2C6 
England   London  T1   T1C2 
England   London  T1   T1C3 
England   London  T1   T1C4 
England   London  T3   T3C3 

我試着用減去一些疑問,EXCEPT存在,不存在的,但還是我不能夠得到rquired結果。我不擅長SQL。請幫忙。

+0

你有沒有嘗試什麼嗎?請包含您的SQL以及您獲得的結果。 –

+0

@LutzHorn是的。我嘗試了以下,但沒有奏效。 SELECT DISTINCT Country_Name,City_Name,Table_Name,Column_Name FROM City_Details WHERE EXISTS(SELECT * FROM Max_Column_Details WHERE City_Details.table_name = Max_Column_Details.table_name and City_Details.column_name = Max_Column_Details.column_name)minus(SELECT * FROM City_Details)order by 1,2,3; – sds

+0

請編輯您的問題以包含SQL。不要將代碼放入評論中。 –

回答

1
with ct as (select distinct Country_Name, City_Name, Table_Name 
      from City_Details) 
select ct.Country_Name, ct.City_Name, m.Column_name 
    from ct, Max_Column_Details m 
    where ct.Table_Name = m.Table_Name 
    and not exists (select 1 from City_Details 
         where Country_Name = ct.Country_Name 
         and City_Name = ct.City_Name 
         and Table_Name = ct.Table_Name 
         and Column_Name = m.Column_Name) 
    order by 1, 2, 3; 

應該做的伎倆

+0

謝謝。這真的有訣竅。但是,你能解釋我們在這裏完成了什麼嗎? – sds

+0

對不起。由於我沒有足夠的聲望點,因此我無法提出您的答案。 – sds

+0

沒關係,接受答案也給了mit 15個重點。我們在這裏做了什麼:第一行('with ...')使得子查詢可用爲'ct',因此我們知道哪些城市使用哪個表。這與Max_Column_Details(作爲一個老式的核心Oracle用戶,我通常不使用JOIN關鍵字,如果你願意稱它爲壞習慣),然後用子查詢來找出哪些可能的組合缺失相關。 –