sql - SQL Server 2016 AdventureWorks NULL 检查
问题描述
我正在处理两个不同的任务,我必须进行空值检查,但我不确定我是否正确编写了语法,因为我的导师还没有真正讨论过这个问题,但会为它做标记。
以下是2个问题和我写的内容。任何帮助表示赞赏。
作业 1 问题:为未在线订购且未使用信用卡订购的订单创建销售订单编号列表。注意:0 为假,1 为位字段真。下面是我使用的语法,我在这里做空检查吗?
SELECT SalesOrderNumber
FROM Sales.SalesOrder_json
WHERE OnlineOrderFlag = 0 AND CreditCardID IS NULL
作业 2 问题:列出没有产品的供应商。下面是我使用的语法,我在这里做空检查吗?
SELECT
pv.Name AS Vendors,
COUNT(PP.ProductID) AS 'Products'
FROM
Purchasing.Vendor AS PV
LEFT JOIN
Purchasing.ProductVendor AS PPV ON PV.BusinessEntityID = PPV.BusinessEntityID
LEFT JOIN
Production.Product AS PP ON PP.ProductID = PPV.ProductID
GROUP BY
PV.Name
HAVING
COUNT(PP.ProductID) = 0;
解决方案
欢迎来到堆栈溢出!
将来,请发布摘要或创建代表查询中使用的表架构的表语句,以便我们有足够的信息来提供比推测性响应更多的信息。即使这是 Adventure Works DB,您也应该以良好的习惯开始您的 SO 之旅!
请尽量不要在网上直接发布作业问题,因为您很容易被大多数学术作业检查员完成抄袭,主要是因为其他学生可能会看到您的帖子,以及您从社区获得的支持,这可能会导致你们所有人都提交同样的结果。
你有没有运行你的查询?你认为结果正确吗?
如果您的查询结果是正确的,那么唯一的问题是“您是否进行了任何空值检查”?可以说,如果您的结果返回了正确的结果,那么您一定满足了标准,否则问题的表述就不是很好。
空检查可以概括为 3 种模式:
您在查询中使用
IS NULL
or直接与 null 进行比较IS NOT NULL
使用
JOIN
语法处理可能包含空值的数据。INNER JOIN
将结果限制为仅在两个表中匹配的记录。如果您需要省略null
在外键字段中有 a 的记录,请使用此选项。- 非INNER加入,如
LEFT JOIN
. 这将从左表返回结果,即使在连接表或右表中没有匹配的记录。- 这是对所有支持的联接的一个很好的讨论:SQL Server 中的 LEFT JOIN 与 LEFT OUTER JOIN
使用聚合函数,聚合通常会省略空值,如果所有值都是 ,则返回
COUNT
0NULL
,而其他聚合如SUM
,MIN
,MAX
,如果所有值都是AVG
NULL
NULL
问题 1
显然,您已经实施了NULL
检查,因为您已经直接在可为空的列上评估标准。
看起来您对问题 1 的回答非常好。
问题 2 虽然您的查询看起来会返回没有产品的供应商,但它也返回零计数。
您不需要输出列以便可以在过滤条件中使用它,因此
COUNT(PP.ProductID) AS 'Products'
请删除,除非另有指示使用它。
这是NULL
支票吗?根据解释,我认为在这种情况下答案是肯定的。通过使用LEFT JOIN
(或 OUTER 连接),您创建了一个结果集,该结果集的字段PP.ProductID
值为NULL
If there are no products。
在该空列的筛选条件中使用 Count 并识别结果为零的 Count 意味着 ProductID 列实际上是空的,这意味着您已经评估了空检查。
还有其他方法可以查询相同的结果,例如使用 NOT EXISTS。NOT EXISTS不会是直接的空检查,因为 NULLABILITY 不是直接评估的。
推荐阅读
- javascript - 在没有 TestNG 的情况下重试测试用例
- c# - 是否可以为 ASPNET.Core OData 声明多个路由
- javascript - Javascript:捕获右键单击元素的ID
- javascript - Javascript 承诺不会在 then() 中运行代码
- android - 使用 ACTION_CREATE_DOCUMENT 写入的文件在 Google Drive 上是空的,但不是本地存储
- javascript - 如何通过 css 在文本之间添加额外字符。应用了 CSS 但显示错误的结果
- java - 在 Chrome Devtools for Java 中使用 io.webfolder.cdp.command.DOMDebugger(和示例)
- typescript - 自定义 tslint 规则来捕获“=== undefined”不起作用
- angular - 如何保存 *ngFor 生成的输入数据
- makefile - 如何缩短Makefile中的路径?