SQL Server Management Studio 查询检查数据是否损坏(选择、连接等)

标签 sql sql-server database join ssms

我试图为两个表(ReceiptReceiptLine)编写查询,发现收据不包含任何行的数据损坏。我在谷歌驱动器上有一个数据库文件的 .bak,但不确定这里是否有人愿意付出努力来帮助我:D

i.e. Write a query to find data corruption where a receipt does not contain any lines. (HINT: Use the Receipt and ReceiptLine tables). -- Return the UniqReceipt and ReferNumber columns.

我需要返回“UniqReceipt”和“ReferNumber”列。

看起来Receipt表的主键是'UniqReceipt'列,ReceiptLine的主键是'UniqReceiptLine'列,外键'UniqReceipt'引用 Receipt 表中的“UniqReceipt”列

收据表如下所示: enter image description here

ReceiptLine 表如下所示: enter image description here

我最终想出了这个:

SELECT r.UniqReceipt, r.ReferNumber
FROM Receipt r
INNER JOIN ReceiptLine l ON r.UniqReceipt = l.UniqReceipt
WHERE datalength(l.ReceiptLineNumber) = 0 OR ReceiptLineNumber = '-1' OR ReceiptLineNumber IS NULL

有谁知道这是否是实现它的最佳方式?我基本上查看了 ReceiptLineNumber 为空或 NULL 或“-1”(我们使用 -1 而不是 NULL)并在两个表中的 UniqReceipt = UniqReceipt 时加入。

我不确定使用变量或某些打印语句是否会更好地检查数据是否损坏。

查询结果:enter image description here

最佳答案

除了 INNER JOIN 部分外,您的查询没问题。这只会显示记录在两个表中的位置。您需要改用 LEFT OUTER 联接。这将显示左侧表中的所有记录和右侧表中的匹配记录。如果您还为缺失的行添加 WHERE 子句,您将得到无效的收据:

SELECT r.UniqReceipt, r.ReferNumber
FROM Receipt r
LEFT OUTER JOIN ReceiptLine l ON r.UniqReceipt = l.UniqReceipt
WHERE l.ReceiptLineNumber IS NULL

关于SQL Server Management Studio 查询检查数据是否损坏(选择、连接等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56248841/

相关文章:

网站上的 PHP 文件 - mysql_connect() 中出现 fatal error

sql - 为什么 MongoDB 比 SQL DB 快得多的任何详细和具体原因?

mysql - 将逗号分隔列表存储在数据库中会占用大量内存空间吗?

sql - SQL Server 2008中合并语句错误

php - 如果变量的语句错误

sql - 递归sql子集查询,使用connect by

asp.net - 页面查看计数器 - 数据库设置和技术/策略

sql-server - 是否可以在 powershell 中使用服务器凭据创建 Microsoft SMO SQL 连接?

sql - 描述数据库不相交关系

mysql - Access : CrossTab Query Increase Data Text 'length' ?