【发布时间】:2014-06-08 05:12:41
【问题描述】:
虽然我的帖子和this类似,但我还是觉得这和那个有点不同。
我有 2 个 CSV 文件。
File A File B
+-------------------------------------------------------------------+
| Name | Country Name | Country |
+-------------------------------------------------------------------+
| Ferrari | Italy Jaguar | British |
| Mercedes | Germany Chevrolet | America |
| Jaguar | British Bugatti | Italy |
| Nissan | Japan Tata | India |
| Chevrolet | USA Nissan | Japan |
+-------------------------------------------------------------------+
以上仅用于说明。一般来说,我在两个文件中都有更多的行和列,但它们的结构是相同的。
我被要求高效地对所有列进行行级比较。因此,我建议使用 HSQLDB 来代替以编程方式进行
CREATE TEXT TABLE 和 SET SOURCE 分别与文件,然后在文件之间进行EXCEPT 操作。我做了代码,它就像一个魅力。下面是我为实现相同目的而编写的 SQL 部分。
CREATE TABLE COMPARE_TABLE AS (SELECT SRC.*, 'SRC-TGT' compare_order FROM TABLEA SRC EXCEPT SELECT TGT.*, 'SRC-TGT' compare_order FROM TABLEB TGT) WITH DATA;
INSERT INTO COMPARE_TABLE SELECT TGT.*, 'TGT-SRC' compare_order FROM TABLEB TGT EXCEPT SELECT SRC.*, 'TGT-SRC' compare_order FROM TABLEA SRC;
这给了我一个如下所示的结果表(考虑到上面的示例数据):
比较表
+------------+----------+---------------+
| Name | Country | Compare_order |
+------------+----------+---------------+
| Ferrari | Italy | SRC-TGT |
| Mercedes | Germany | SRC-TGT |
| Chevrolet | USA | SRC-TGT |
| Chevrolet | America | TGT-SRC |
| Bugatti | Italy | TGT-SRC |
| Tata | India | TGT-SRC |
+------------+----------+---------------+
从这里,我需要找出每一行不匹配的原因?至少,从广义上讲,我想将其分为 3 类:
- 源头上的新功能
- Target 的新功能
- 值已更改(如果可能,哪些列?)
最后,我希望我的表格如下所示:
COMPARE_TABLE
+------------+----------+---------------+------------------------+
| Name | Country | Compare_order | Failure_Reason |
+------------+----------+---------------+------------------------+
| Ferrari | Italy | SRC-TGT | New at Source |
| Mercedes | Germany | SRC-TGT | New at Source |
| Chevrolet | USA | SRC-TGT | Country value mismatch |
| Chevrolet | America | TGT-SRC | Country value mismatch |
| Bugatti | Italy | TGT-SRC | New at Target |
| Tata | India | TGT-SRC | New at Target |
+------------+----------+---------------+------------------------+
我该怎么做呢?我们甚至可以在 SQL 中做到这一点吗?
非常感谢任何帮助。
【问题讨论】:
-
请格式化您的问题
-
为什么这个问题被标记为mysql?
-
@eggyal 我将最终的 COMPARE_TABLE 转储到 mysql。我接下来的步骤也可以在mysql中。这就是为什么。
-
MySQL 不支持
except(或intersect)所以你需要在那里找到不同的方法。
标签: mysql sql left-join except