客户向我们发送了几个表,我们需要能够相互交叉引用。不幸的是,我们需要用于交叉引用的列具有不一致的格式化数据。
然而,看起来像它们以一致的方式不一致。即,在一列中,有一个“名称”,在另一列中有一个名称前面有一个4位数的id代码和一个空格,所以“1234名称”。
如果不一致是正确的,那么我们可以通过调用MySQL子串函数来使用数据。但我不相信。我如何确定不一致性是否具有普遍性?如果还有其他不一致之处我还没看到怎么办?
我需要知道的是,columnA中的所有唯一值是否为substring(columnB,6)中的所有唯一值。
我在MySQL上并不擅长并尝试了一些查询,但是他们要么返回所有结果(不是明显的结果),要么他们已经在服务器上“中断”,因为那里有很多数据,他们需要永远运行。帮助
答案 0 :(得分:1)
您可以使用not exists
子句执行此操作:
select t1.*
from t1
where not exists (select 1
from t2
where t2.name = substring(t1.columnB, 6)
);
这将根据您提供的规则识别t1.columnB
中没有匹配名称的所有t2
。
答案 1 :(得分:0)
这是一个需要解决的可怕问题 - 特别是如果您不熟悉SQL。
原则上,我总是将这种数据视为“不受信任” - 无论您认为适用的规则通常会随着时间推移而变得虚假。
我的策略是使用“脏”数据通过运行SQL查询来填充类似的“干净”表,而不是尝试直接使用“脏”数据。
因此,您可以使用您认为最合适的架构创建两个表<然后通过将substring(columnB, 6)
插入该表来填充该表。通过添加where子句(例如isnumeric(substring(t1.columnB, 6))
),您可以验证您的假设。
一旦有了“干净”的表格,就可以轻松地进行联接。