SQL查询:为所有产品生成报告

SQL查询:为所有产品生成报告,sql,Sql,我需要帮助来构建SQL查询 我有两个表表PROJECT和PRODUCT,其中包含以下字段: 项目: 项目代码 项目名称 产品: 项目代码 项目名称 项目代码 替换字节码 REPLACEDBYCODE将包含其他ITEMCODE(意味着此产品已被其他产品替换)。如果尚未替换产品,则REPLACEDBYCODE的值将为空“” 我想为所有产品制作一份报告,如下所示: ITEMCODE | ITEMNAME | REPLACEDBYCODE | **REPLACED_ITEM_NAME** | P

我需要帮助来构建SQL查询

我有两个表表PROJECT和PRODUCT,其中包含以下字段:

项目:

  • 项目代码
  • 项目名称
产品:

  • 项目代码
  • 项目名称
  • 项目代码
  • 替换字节码
REPLACEDBYCODE将包含其他ITEMCODE(意味着此产品已被其他产品替换)。如果尚未替换产品,则REPLACEDBYCODE的值将为空“”

我想为所有产品制作一份报告,如下所示:

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

您可以将表连接到其自身:

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
列有一个外键约束,在这种情况下,甚至不允许将空字符串作为值。

您需要通过外部联接将产品本身联接起来。也就是说,查询将返回所有项目,并显示具有替换代码的ITME的新名称

 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。

用您正在使用的RDBMS(例如SQL Server、Oracle、Postgres、MySQL)标记您的问题。