2017-10-14 152 views
0

我处于我的SQL知识的末尾。我有问题,我想检查两个表是否具有相同的行数。SQL:如果存在 - >比较两个表并检查它们是否具有相同的行数

一个例子可能是我想向所有学校展示椅子数量相同的学生人数。我的伪代码如下所示:

SELECT * FROM schools WHERE 
    ((SELECT COUNT(*) FROM students) = (SELECT COUNT(*) FROM chairs)); 

或用伪计算:students - chairs = 0;

SELECT * FROM schools WHERE 
    ((SELECT COUNT(*) FROM students) - (SELECT COUNT(*) FROM chairs) = 0); 

这样的结构与SQL可能,如果是这样如何?

回答

2

你的做法似乎有点非正统的,但你可以用相关子查询做到这一点:

SELECT s.* 
FROM schools s. 
WHERE ((SELECT COUNT(*) FROM students st WHERE st.school_id = s.school_id) = 
     (SELECT COUNT(*) FROM chairs c WHERE c.school_id = s.school_id) 
    ); 

我会更倾向于做聚合后加入:

select st.school_id 
from (SELECT st.school_id, COUNT(*) as cnt 
     FROM students st 
     GROUP BY st.school_id 
    ) st JOIN 
    (SELECT c.school_id, COUNT(*) as cnt 
     FROM chairs c 
     GROUP BY c.school_id 
    ) c 
    ON st.school_id = c.school_id AND st.cnt = c.cnt; 

的两个版本微妙的不同。此版本只会返回至少有一名学生(和主席)的学校ID。

编辑:

我要指出的是,如果你只是想知道,如果两个表具有相同的行数,你可以返回在SELECT一个布尔值:由于存在

SELECT ((SELECT COUNT(*) FROM chairs c) = 
     (SELECT COUNT(*) FROM students st) 
     ) as num_rows_same_flag 

尽管如此,我认为你想让每个学校的数字相同。

+0

你好,戈登,谢谢你的回答,你帮了我很多了解。最后一句话:我只想向学校展示椅子和学生数量相同的学校。 – Martin

+0

@Martin。 。 。这是我的预期。然而,你的问题的标题表明你指的是整个表格(不只是每个学校),所以我添加了编辑。 –

+0

再次感谢您的帮助,我现在修改了我的代码,它的工作方式和预期的一样。 – Martin

相关问题