我试图为两个表(receipt和receiptline)编写一个查询,查找收据不包含任何行的数据损坏。我在google drive上有一个数据库文件的.bak文件,但不确定这里是否有人愿意努力帮助我:d
即,编写查询以查找收据不包含的数据损坏
任何台词。(提示:使用收据和收据行表)。
--返回uniqreceipt和referenumber列。
我需要返回“uniqreceipt”和“referenumber”列。
似乎接收表的主键是“uniqreceipt”列,接收行的主键是“uniqreceiptline”列,外键“uniqreceipt”引用接收表中的列“uniqreceipt”
收据表如下所示:
sql - SQL Server Management Studio查询检查数据是否损坏(选择,联接等)。-LMLPHP
像这样的收银台:
sql - SQL Server Management Studio查询检查数据是否损坏(选择,联接等)。-LMLPHP
我最后想到了这个:

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为空或空或'-1'(我们使用-1而不是空)并且在两个表中uniqreceipt=uniqreceipt时连接。
我不确定使用变量或某种打印语句是否更好地检查数据损坏。
查询结果:sql - SQL Server Management Studio查询检查数据是否损坏(选择,联接等)。-LMLPHP

最佳答案

除了内部连接部分之外,您的查询没有问题。这将只显示两个表中记录的位置。您需要改用左外连接。它将显示左侧表中的所有记录和右侧表中的匹配记录。如果您还为缺少的行添加了where子句,您将得到无效的收据:

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

10-04 16:31