我在正确编写此查询时遇到问题。下面是目标,我当前的查询以及随附的用于构建和填充数据库的脚本。感谢您的协助!
对于目录中的每张DVD,显示其标题,长度,发行日期,以及所有库中所有客户已检出该DVD的次数。包括那些尚未签出的内容(显示为0)。按标题对结果进行排序。
SELECT C.TITLE, D.LENGTH, C.RELEASE_DATE, COUNT(T.TRANSACTION_ID)
FROM catalog_item C
INNER JOIN dvd D ON D.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
INNER JOIN physical_item P ON P.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT OUTER JOIN transaction T ON T.PHYSICAL_ITEM_ID = P.PHYSICAL_ITEM_ID
GROUP BY C.TITLE;
先运行:https://drive.google.com/open?id=1PYAZV4KIfZtxP4eQn35zsczySsxDM7ls
第二秒:https://drive.google.com/open?id=1pAzWmJqvD3o3n6YJqVUM6TtxDafKGd3f
编辑
我已经使查询正常工作,但是还没有弄清楚如何以零签出的方式显示DVD。以下是我更新的查询。
SELECT C.TITLE, D.LENGTH, C.RELEASE_DATE, COUNT(T.TRANSACTION_ID)
FROM catalog_item C
INNER JOIN dvd D ON D.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
INNER JOIN physical_item P ON P.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT OUTER JOIN transaction T ON T.PHYSICAL_ITEM_ID = P.PHYSICAL_ITEM_ID
GROUP BY C.TITLE, D.LENGTH, C.RELEASE_DATE;
已解决
在GMB的帮助下找出了问题。最终查询如下!
SELECT C.TITLE, D.LENGTH, C.RELEASE_DATE, NVL(COUNT(T.TRANSACTION_ID), 0) AS NUMBER_OF_CHECKOUTS
FROM catalog_item C
INNER JOIN dvd D ON D.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT JOIN physical_item P ON P.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT JOIN transaction T ON T.PHYSICAL_ITEM_ID = P.PHYSICAL_ITEM_ID
GROUP BY C.TITLE, D.LENGTH, C.RELEASE_DATE
ORDER BY C.TITLE;
答案 0 :(得分:1)
您的第二个查询肯定比第一个查询好,因为它具有正确的GROUP BY
子句。
很难在不看到完整表结构的情况下提供100%确定的响应,但是,如果您仍然缺少输出中检出0的记录,则意味着您的INNER JOIN
之一不匹配。换句话说,您的目录中的DVD要么不在dvd
表中,要么不在physical_item
表中。由于两个表都看起来像是引用表,因此这可能表明您的数据存在差异。我建议将所有INNER JOIN
更改为LEFT JOIN
,以解决此问题。
还请注意,如果DVD没有结帐,表达式COUNT(T.TRANSACTION_ID)
将产生NULL
:因此,您需要将其包装在NVL
函数中以处理这种情况。>
新查询:
SELECT C.TITLE, D.LENGTH, C.RELEASE_DATE, NVL(COUNT(T.TRANSACTION_ID), 0)
FROM catalog_item C
LEFT JOIN dvd D ON D.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT JOIN physical_item P ON P.CATALOG_ITEM_ID = C.CATALOG_ITEM_ID
LEFT JOIN transaction T ON T.PHYSICAL_ITEM_ID = P.PHYSICAL_ITEM_ID
GROUP BY C.TITLE, D.LENGTH, C.RELEASE_DATE;