SQL Server Management Studio 查询检查数据是否损坏(选择、连接等)
SQL Server Management Studio query check for data corruption (selects, joins, etc..)
我试图为两个 table 编写查询(Receipt 和 ReceiptLine),发现数据损坏,其中收据不包含任何行。我在 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
我试图为两个 table 编写查询(Receipt 和 ReceiptLine),发现数据损坏,其中收据不包含任何行。我在 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