【问题标题】:Generate Report that shows which Ids matched between two SQL tables生成显示两个 SQL 表之间匹配的 Id 的报告
【发布时间】:2015-07-30 16:32:22
【问题描述】:

我有一个 SQL 查询,我正在运行将值从 table1 插入到 table2 中,仅当表行的 Id 匹配时:

UPDATE PT
SET CreditInvoiceAmount = CSV.CreditInvoiceAmount
,CreditInvoiceDate = CSV.CreditInvoiceDate
,CreditInvoiceNumber = CSV.CreditInvoiceNumber
,CreditDeniedDate = CSV.CreditDeniedDate
,CreditDeniedReasonId = CSV.CreditDeniedReasonId
,CreditDeniedNotes = CSV.CreditDeniedNotes
,StatusId = CASE 
                WHEN CSV.CreditInvoiceDate IS NULL
                    AND CSV.CreditDeniedDate IS NOT NULL
                        THEN 7
                ELSE 8
            END
FROM PermanentTable PT
INNER JOIN TemporaryCsvUpload CSV ON PT.Id = CSV.Id

我会说临时表中大约 60% 的 Id 将与永久表中的 Id 匹配。我想生成某种报告来显示哪些 ID 匹配,哪些不匹配。我显示该信息的格式并不重要(HTML 表格、Excel 表格等)。我不确定如何使用查询来获取该信息,以便显示它。感谢您的帮助!

【问题讨论】:

  • 您使用的是什么 SQL Server 版本?

标签: c# sql sql-server asp.net-mvc excel


【解决方案1】:

要显示所有 ID,以及它们是否在一个或两个表中,试试这个;它将返回至少在一个表中的 ID 列表,并带有一个标志,指示它们出现在哪个或哪些表中:

Select ISNULL(p.ID, t.ID) as ID
, case when p.ID is not null then 'Y' else 'N' end as InPermanentTable
, case when t.ID is not null then 'Y' else 'N' end as InTemporaryTable
from PermanentTable p
full outer join TemporaryCsvUpload t
on p.ID = t.ID

要仅返回临时表中的 ID,以及指示它们是否在永久表中的标志,请使用以下命令:

Select t.ID
, case when p.ID is not null then 'Y' else 'N' end as InPermanentTable
from TemporaryCsvUpload t
left join PermanentTable p
on p.ID = t.ID

【讨论】:

  • 我怎样才能只显示带有 Y 的字段,隐藏 N 或 null 值?
  • @CavanFlynn 我已编辑以解决您的评论 - 上面的第二个查询是您要查找的内容吗?
  • 是的,完美。对于在视图中显示查询结果的最佳方式,您有什么建议吗?
  • 这实际上取决于您的用户需要什么信息,例如要加入的其他列或要对这些结果执行的聚合。上面的查询应该是相当有效的,所以如果你愿意的话,你可以把它放到一个视图中。如果您对视图的语法有疑问,您应该将其作为一个新问题发布。
  • @CavanFlynn 乐于助人。如果这回答了您的问题,请考虑将其标记为“已接受”。
【解决方案2】:

MERGE 语句将符合您的要求。它能够更新匹配的内容,插入不匹配的内容,并向您报告匹配的内容和不匹配的内容。最好将输出记录到另一个表中。

MERGE PermanentTable P --target
USING TemporaryCsvUpload T --source
ON P.Id = T.Id
WHEN MATCHED THEN
    UPDATE P
    SET CreditInvoiceAmount = T.CreditInvoiceAmount
    ,CreditInvoiceDate = T.CreditInvoiceDate
    ,CreditInvoiceNumber = T.CreditInvoiceNumber
    ,CreditDeniedDate = T.CreditDeniedDate
    ,CreditDeniedReasonId = T.CreditDeniedReasonId
    ,CreditDeniedNotes = T.CreditDeniedNotes
    ,StatusId = CASE 
                    WHEN T.CreditInvoiceDate IS NULL
                        AND T.CreditDeniedDate IS NOT NULL
                            THEN 7
                    ELSE 8
                END
WHEN NOT MATCHED THEN
    INSERT (P columns go here)
    VALUES (T columns go here)
OUTPUT $action, Inserted.Id --Inserted will show both inserted and updated to IDs
    , Deleted.Id --Deleted will show IDs that were changed in the UPDATE

由于您只是更新/插入,因此当操作为 UPDATE 时,插入和删除的 Id 将是相同的。

您也可以将WHEN NOT MATCHED 更改为登录到单独的表,而不是永久表。

【讨论】:

  • 看起来不错,就我的项目而言,我只需要更新 Id 匹配的行并报告哪些 Id 匹配和哪些不匹配。不插入不匹配的 ID。
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多