2011-08-02 187 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