比较2个表,并获得计数相同的行

时间:2010-11-12 10:33:24

标签: sql sql-server

表1

ID   class
1    A
2    A
3    B
4    C

表2

ID   class
1    A
3    B
4    C

嗨,有没有比较每个表的计数(类)的简单方法,如果2个表具有相同的计数,则返回ID和类。

想要获得以下结果:

ID  class
3   B
4   C

4 个答案:

答案 0 :(得分:1)

一种方法是:

SELECT t1.ID, t1.Class
FROM Table1 t1
JOIN
(
    SELECT Class, COUNT(*) AS NumberOf
    FROM Table1
    GROUP BY Class
) x1 ON t1.Class = x1.Class
JOIN
(
    SELECT Class, COUNT(*) AS NumberOf
    FROM Table2
    GROUP BY Class
) x2 ON x1.Class=x2.Class AND x1.NumberOf = x2.NumberOf

编辑,因为我原来误解了!我已经随意返回了Table1中的ID,其中给定类的编号在两个表中都匹配

答案 1 :(得分:1)

SELECT
    tbl1.class
FROM
    (SELECT class, count(1) as cnt FROM table1 GROUP BY class) tbl1,
JOIN (SELECT class, count(1) as cnt FROM table2 GROUP BY class) tbl2 ON tbl1.class=tbl2.class

WHERE 
    tbl1.cnt=tbl2.cnt

您将无法获取ID,因为如果B或C类有更多ID,则数据库引擎将不知道要选择哪个ID。一旦您知道自己需要什么,就必须编写更复杂的查询。

答案 2 :(得分:0)

试试这个:

SELECT CLASS, ID
  FROM TABLE1
  WHERE CLASS IN
    (SELECT CLASS FROM
      (SELECT * FROM
        (SELECT CLASS, COUNT(*) AS class_count
           FROM table1
           GROUP BY CLASS) T1
      INNER JOIN
        (SELECT CLASS, COUNT(*) AS class_count
           FROM table2
           GROUP BY CLASS) T2
        USING (CLASS, CLASS_COUNT)));

这将从TABLE1返回ID和CLASS,并用于提供的测试数据。不保证适用于所有可能的数据组合。使用风险由您自己承担。不得用于医疗设备,空中交通管制系统或其他涉及严重伤害,死亡或责任风险的应用。你的旅费可能会改变。 16岁以下儿童的使用应由负责任的成年人监督。不要在强磁场,强风或青蛙或其他小型两栖动物的雨中使用。不鼓励在大型两栖动物或食肉爬行动物存在的情况下使用。没有在动物身上测试过 - 你会成为第一个!

分享并享受。

答案 3 :(得分:0)

您可以使用新条款INTERSECT来获取它。

有关此新条款的详细信息,请查看此帖:

http://blog.sqlauthority.com/2008/08/03/sql-server-2005-difference-between-intersect-and-inner-join-intersect-vs-inner-join/