【问题标题】:SQL Server Management Studio query check for data corruption (selects, joins, etc..)SQL Server Management Studio 查询检查数据损坏(选择、连接等)
【发布时间】:2019-10-08 11:18:17
【问题描述】:

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

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

我需要返回“UniqReceipt”和“ReferNumber”列。

Receipt表的主键好像是'UniqReceipt'列,ReceiptLine的主键是'UniqReceiptLine'列,外键是'UniqReceipt'参考 Receipt 表中的“UniqReceipt”列

收据表如下所示:

和这样的 ReceiptLine 表:

我最终想出了这个:

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 时加入。

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

查询结果:

【问题讨论】:

    标签: sql sql-server database join ssms


    【解决方案1】:

    除了 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
    

    【讨论】:

    • 如果您也可以使用“不存在”显示相同的查询,那就更好了。
    【解决方案2】:

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

    还有一点,您应该始终以单一方式表示 NULL 值。在一个地方,您将它们表示为 -1,在另一个地方,您将它们保留为 NULL,而在另一个地方,您将它们保留为空白空间。这会导致混乱。如果收据没有收据行,为了更清楚起见,我建议将它们简单地保留为 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 表达式。这种案例表达只是一个学生在不理解的情况下抓着稻草 - 你应该看到并解释的东西。
    • @SMor,正如他所说,他以多种方式表示 NULL,我希望有一个统一的表示。我已经向 OP 提过,数据存储不正确
    猜你喜欢
    • 2016-12-18
    • 2014-01-31
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多