【问题标题】:SQL query for big files大文件的 SQL 查询
【发布时间】:2012-02-25 20:55:40
【问题描述】:

我有两个大约 10 万行的文本文件。每行都有十位数字。两个文件中可能有相同的行,我想过滤它们。例如:

文件1:

1256745889
1515487882 <---same
4841453222

...

文件2:

7748523695
1515487882 <---same
8745529699

...

这是我的实际 SQL 查询

SELECT
    table1.cjsz
FROM
    table1
    INNER JOIN table2 ON 
        table1.cjsz != table2.cjsz
WHERE
    LENGTH(table1.26_code)=0;

它没有给出预期的结果。你能帮我解决这个问题吗?

谢谢

【问题讨论】:

  • SELECT table1.cjsz FROM table1 INNER JOIN table2 ON table1.cjsz != table2.cjsz WHERE LENGTH(@9 987654333@)=0;
  • 欢迎来到stackoverflow。你能详细说明“没有给出预期的结果”吗?使用您之前的示例,实际 结果是什么?您期望的是什么?这将帮助其他人了解您想要实现的目标。

标签: sql


【解决方案1】:

获取表 1 中而不是表 2 中的所有 id

select cjsz from table1
MINUS
select cjsz from table2

获取表 2 中而不是表 1 中的所有 id

select cjsz from table2
MINUS
select cjsz from table1

获取表 1 和表 2 中的所有 id

select cjsz from table1
INTERSECT
select cjsz from table2

【讨论】:

  • 为了完整性:select cjsz from table1 UNION select cjsz from table2 从两者中选择所有唯一行。
  • MINUS 是仅 Oracle 的运算符。标准运算符是EXCEPT
【解决方案2】:

完全确定你想要完成什么,但你有没有尝试过类似的东西:

SELECT table1.cjsz WHERE LENGTH(table1.[26_code]) = 0
EXCEPT
SELECT table2.cjsz

【讨论】:

  • 他想要Table1和Table2的对称差
【解决方案3】:

如果你使用的是 SQLServer,你可以使用EXCEPT 操作符,否则你可以试试这个命令:

SELECT
     table1.cjsz
FROM
     table1 LEFT OUTER JOIN table2 ON table1.cjsz = table2.cjsz
WHERE
     table2.cjsz IS NULL AND LENGTH(table1.26_code) = 0

【讨论】:

    【解决方案4】:

    如果我让您找到正确的方向,那么您正在寻找 Table1 和 Table2 之间的 symmetric difference。在网上搜索后,我找到了一个不错的blog entry,提供了一个关于此的 SQL 示例,我准备了自己的示例,请试一试,告诉我是否需要它。

    CREATE TABLE Table1 (id int, value char(1));
    
    INSERT INTO Table1 values (1, 'H');
    INSERT INTO Table1 values (2, 'e');
    INSERT INTO Table1 values (3, 'l');
    INSERT INTO Table1 values (4, 'l');
    INSERT INTO Table1 values (5, 'o');
    INSERT INTO Table1 values (6, ' ');
    INSERT INTO Table1 values (7, ' ');
    
    CREATE TABLE Table2 (id int, value char(1));
    
    INSERT INTO Table2 values (6, ' ');
    INSERT INTO Table2 values (7, ' ');
    INSERT INTO Table2 values (8, ' ');
    INSERT INTO Table2 values (9, 'w');
    INSERT INTO Table2 values (10, 'o');
    INSERT INTO Table2 values (11, 'r');
    INSERT INTO Table2 values (12, 'l');
    INSERT INTO Table2 values (13, 'd');
    
    
    SELECT *
      FROM (
        SELECT a.id, a.value FROM Table1 a
        UNION ALL
        SELECT b.id, b.value FROM Table2 b
      ) AS t
      GROUP BY t.id, t.value
      HAVING COUNT(id) = 1
    ORDER BY id;
    

    【讨论】:

      猜你喜欢
      • 2016-12-28
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      相关资源
      最近更新 更多