SQL Server-对两列中的重复值进行反向验证[内部示例]

SQL Server-对两列中的重复值进行反向验证[内部示例],sql,sql-server,tsql,ssms,Sql,Sql Server,Tsql,Ssms,我正在尝试执行验证,以检查是否已按相反顺序输入相同的外汇汇率值。用户将填写由三列组成的电子表格: 从货币 通货 速度 用户将数据添加到电子表格中,以便通过系统导入,下面是数据外观的模拟示例: 我已经准备好了验证的结构,我只是想知道如何编写select语句来返回所有具有两个方向的行,就像本例中的前两行一样,因为它们是相同的货币,只是顺序相反。Hmmm,您可以使用: select fx.* from fx where exists (select 1 from fx fx

我正在尝试执行验证,以检查是否已按相反顺序输入相同的外汇汇率值。用户将填写由三列组成的电子表格:

从货币 通货 速度 用户将数据添加到电子表格中,以便通过系统导入,下面是数据外观的模拟示例:

我已经准备好了验证的结构,我只是想知道如何编写select语句来返回所有具有两个方向的行,就像本例中的前两行一样,因为它们是相同的货币,只是顺序相反。

Hmmm,您可以使用:

select fx.*
from fx
where exists (select 1
              from fx fx2
              where fx2.fromc = fx.toc and fx2.toc = tx.fromc and fx2.rate = fx.rate
             );
实际上,您可以扩展此检查以确保这些值接近于彼此的算术倒数。由于十进制值存在一些松弛,我建议:

select fx.*
from fx
where exists (select 1
              from fx fx2
              where fx2.fromc = fx.toc and fx2.toc = tx.fromc and
                    abs(fx2.rate * fx.rate - 1) > 0.001
             );

这将检查产品是否偏离千分之一以上。您想要的确切阈值取决于您的需要。

FWIW,我读到的是相同的货币,只是按相反顺序只检查[从货币]和[到货币],而不涉及[汇率]。由于示例显示,美元和英镑在任一方向的转换[汇率]为1.30,因此您的汇率检查将排除重复的汇率。请阅读以了解有关改进您的问题的一些提示。