【问题标题】:What is the standard SQL Query to retrieve the intersection of tables?检索表交集的标准 SQL 查询是什么?
【发布时间】:2010-09-14 00:14:22
【问题描述】:

选择联合:

select * from table1 
union 
select * from table1_backup 

选择交叉点的查询是什么?

【问题讨论】:

  • 基于每个字段或仅键的交集?
  • 您使用的是 SQL Server 2005 还是其他一些 DBMS?
  • 尝试跨数据库兼容。主要关注 MySQL 和 SQLServer。

标签: sql


【解决方案1】:

在 SQL Server 中intersect

select * from table1 
intersect
select * from table1_backup

【讨论】:

  • 开枪,所以这只是一个 SQL Server 的答案,没有 SQL Server/MySQL 跨数据库查询吗?
  • 根据我在 google 上发现的 2005 年的博客文章和 listservs,MySQL 不支持直接相交表示法,而是建议使用内连接或子查询。
  • 该问题并未说明需要 MySQL 解决方案。请注意,兴趣也是隐含的 DISTINCT(与 UNION 和 MINUS 相同)
【解决方案2】:
SELECT *
FROM table1
WHERE EXISTS
(SELECT *
FROM table1_backup
WHERE table1.pk = table1_backup.pk)

作品

【讨论】:

  • 这看起来是一个不错的答案,但不像我接受的那样抽象。它可能也更快。
  • 就我而言,我不需要 where 子句。
  • 你需要一个 WHERE 子句,否则它没有意义。如果 table1_backup 中存在任何行,您将只返回 table1 中的所有行。否则你会得到零行。
【解决方案3】:

对于这样的问题,我倾向于回到这个视觉资源:

A Visual Explanation of SQL Joins

【讨论】:

    【解决方案4】:

    我认为内部连接: 假设 T1 和 T2 具有相同的结构:

    从 T1.* 中选择 T1 内连接 T2 在 T1.pkField = T2.pkField

    【讨论】:

    • 联合很有用,因为它不会添加额外的字段。它在使用时将两个表视为同一个表。我想要同样的东西,除了我想看看哪些记录是完全相同的,以防在运行备份时出现问题。
    【解决方案5】:

    “相交”也是标准 SQL 的一部分。

    内连接给出了不同的答案。

    【讨论】:

    • 那么查询是什么? select * from table1 intersect select * from table2 在 mysql 中给我一个错误
    【解决方案6】:

    这里有一个针对 mySQL 的解决方案:

    CREATE TABLE table1(
    id INT(10),
    fk_id INT(10),
    PRIMARY KEY (id, fk_id),
    FOREIGN KEY table1(id) REFERENCES another_table(id),
    FOREIGN KEY table1(fk_id) REFERENCES other_table(id)
    );
    
    SELECT table1.* FROM table1 as t0
    INNER JOIN table1 as a ON (t0.id = a.id and fk_id=1)
    INNER JOIN table1 as b ON (t0.id = b.id and fk_id=2)
    INNER JOIN table1 as c ON (t0.id = c.id and fk_id=3)
    ORDER BY table1.id;
    

    基本上你有一个数学子集表(即 1={1, 2 ,3}, 2={3, 4, 2}, ... , n={1, 4, 7})属性 id 是集合编号,fk_id 引用元素表的主键,即超集(表示大括号中数字的可能值)。对于那些不喜欢数学的人,让我们假设你有一个表,'other_table',它是一个项目列表,还有另一个表,'another_table',它是一个事务号列表,两个表形成一个多对-many 关系,从而产生'table1'。现在让我们假设您想知道 'another_ table' 中包含项目 1、2 和 3 的 id。这就是执行此操作的查询。

    【讨论】:

      【解决方案7】:

      可以用这种方式在两个相同的表 a 和 b 上进行相交:

      SELECT a.id, a.name
      FROM a INNER JOIN b
      USING (id, name)
      

      【讨论】:

        【解决方案8】:

        子查询?!真的吗?

        获取table1和table2的交集:

        SELECT * FROM table1, table2 WHERE table1.pk=table2.pk;
        

        【讨论】:

        • 那不是交集,那只是一个连接。联合使用两个相同的数据集,我正在寻找一个相关的功能。你是对的,你可以加入每个领域。 -1 只是为了徒劳地使用主的名字。
        【解决方案9】:
        select distinct * from (select * from table1 union select * from table1_backup) 
        

        【讨论】:

        • 太好了,这是我要找的查询,stackoverflow 很棒,只用了 5 分钟,比 Google-ing 有趣多了。这个答案在各个方面对我来说都是完美的,除了它需要在最后有“as table_x”才能在我的 SQL 版本中不出现密钥冲突。
        • 这不返回相交...它返回每个表中的每一行,并过滤掉重复项。
        猜你喜欢
        • 2011-08-10
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多