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