2011-08-02 237 views
0

我需要幫助來構建SQL查詢。SQL查詢幫助

我有2代表的表項目和產品,其具有這樣的字段:

PROJECT:

  • PROJECTCODE
  • PROJECTNAME

PRODUCT:

  • ITEMCODE
  • ITEMNAME
  • PROJECTCODE
  • REPLACEDBYCODE

的REPLACEDBYCODE將包含其他ITEMCODE(意思是,該產品已取代其它產物)。如果產品尚未被替換,REPLACEDBYCODE將具有空白值''。

我想爲所有的產品這樣的報告:

ITEMCODE | ITEMNAME | REPLACEDBYCODE | **REPLACED_ITEM_NAME** | PROJECTNAME 

感謝。

+0

使用您正在使用的RDBMS(例如SQL Server,Oracle,Postgres,MySQL)來標記您的問題。 –

回答

1

您需要通過外連接將PRODUCT加入自己。也就是說,查詢將返回所有項目,併爲具有替換代碼的項目顯示新名稱。

select p1.itemcode 
     , p1.itemname 
     , p1.replacedbycode 
     , p2.itemname replaced_item_name 
from product p1 
     left outer join product p2 
      on p1.replacedbycode = p2.itemcode 
/

注:這是ANSI連接語法。有些風格的RDBMS可能有一個用於外連接的備選語法,例如Oracle pre-9i。

+0

謝謝,它的作品! – ewlung

1

您可以加入一個表本身:

SELECT p.itemcode, p.itemname, p.replacedbycode, r.itemname, j.projectname 
FROM product as p JOIN product as r ON(p.replacedbycode = r.itemcode) 
        JOIN project as j ON(p.projectcode = j.projectcode); 

如果您使用的約定replacedbycode是實際上可以null而不是空白,這是使用數據庫的更地道的方式,那麼你可以使用COALESCE來打印的情況下,有沒有更換項目一個非常錯誤消息:

SELECT p.itemcode, p.itemname, p.replacedbycode, COALESCE(r.itemname, "no replacement"), j.projectname, 
FROM product as p LEFT JOIN product as r ON(p.replacedbycode = r.itemcode) 
        JOIN project as j ON(p.projectcode = j.projectcode); 

注意,在第二種情況下我使用一個左外連接到包括沒有指定的更換行。

回想起來,replacebycode列應該對itemcode列有外鍵約束,在這種情況下,甚至不應該允許您將空字符串作爲值。

+0

現在我瞭解了COALESCE。謝謝。 – ewlung