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

SQL Server Management Studio查询检查数据损坏(选择、联接等),sql,sql-server,database,join,ssms,Sql,Sql Server,Database,Join,Ssms,我试图为两个表(Receipt和ReceiptLine)编写一个查询,查找收据不包含任何行的数据损坏。我在谷歌硬盘上有一个.bak的数据库文件,但不确定这里是否有人愿意帮助我做到这一点:D 即编写查询以查找收据不包含的数据损坏 任何线路。(提示:使用Receipt和ReceiptLine表)。 --返回UniqReceipt和ReferNumber列 我需要返回“UniqReceipt”和“refereNumber”列 看起来,Receipt表的主键是'UniqReceipt'列,Receipt

我试图为两个表(ReceiptReceiptLine)编写一个查询,查找收据不包含任何行的数据损坏。我在谷歌硬盘上有一个.bak的数据库文件,但不确定这里是否有人愿意帮助我做到这一点:D

编写查询以查找收据不包含的数据损坏 任何线路。(提示:使用Receipt和ReceiptLine表)。 --返回UniqReceipt和ReferNumber列

我需要返回“UniqReceipt”和“refereNumber”列

看起来,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时的连接

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


查询结果:

除了内部联接部分外,您的查询是正常的。这将只显示记录在两个表中的位置。您需要改为使用左外部联接。这将在左侧显示表中的所有记录,并在右侧显示表中的匹配记录。如果您还为缺少的行添加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不存在的情况进行分类,然后只选择那些收据

还有一件事,您应该始终以单一方式表示空值。在一个地方,您将它们表示为-1,在另一个地方,您将它们保留为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                                

没有充分的理由使用派生表或复杂(且无意义)的case表达式。那个case表达式只是一个学生抓着稻草而不理解——这是你应该看到和解释的。@SMor,当他告诉我他用多种方式表示NULL时,我想要一个统一的表示。我已经向OP提到,数据存储是不正确的,如果您还可以使用“notexists”显示相同的查询,那就更好了。