我试图为两个表(Receipt 和 ReceiptLine)编写查询,发现收据不包含任何行的数据损坏。我在谷歌驱动器上有一个数据库文件的 .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”列
我最终想出了这个:
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 时加入。
我不确定使用变量或某些打印语句是否会更好地检查数据是否损坏。
最佳答案
除了 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/