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

SQL Server Management Studio query check for data corruption (selects, joins, etc..)

我试图为两个 table 编写查询(ReceiptReceiptLine),发现数据损坏,其中收据不包含任何行。我在 google 驱动器上有一个数据库文件的 .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.

我需要 return 'UniqReceipt' 和 'ReferNumber' 列。

看起来Receipttable的主键是'UniqReceipt'列,ReceiptLine[=39=的主键] 是 'UniqReceiptLine' 列,并且外键 'UniqReceipt' REFERENCES Receipt table

中的列 'UniqReceipt'

收据 table 如下所示:

和 ReceiptLine table 像这样:

我最终想到了这个:

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 时加入 tables.

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

查询结果:

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

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

您可以编写以下查询来对不存在 ReceiptLine 的情况进行分类,然后 select 仅对那些收据进行分类。

还有一件事,您应该始终以单一方式表示 NULL 值。在一个地方,您将它们表示为 -1,而在另一个地方,您将它们保留为 NULL,而在另一个地方,您将它们保留为空 space。这会导致混乱。如果收据没有收据行,我建议将它们简单地保留为 NULL,以便更清楚。

SELECT UniqReceipt,ReferNumber
FROM  
(SELECT r.UniqReceipt
      , r.ReferNumber
      , CASE WHEN l.ReceiptLineNumber = '-1' THEN 0
             WHEN LEN(l.ReceiptLineNumber) = 0 THEN 0
             WHEN l.ReceiptLineNumber IS NULL THEN 0
             ELSE 1 END AS IsReceiptLineNumberPresent                                       
FROM Receipt r
LEFT OUTER JOIN ReceiptLine l ON r.UniqReceipt = l.UniqReceipt) AS t
WHERE IsReceiptLineNumberPresent = 0