How to do a count on a union query

前端 未结 6 1037
谎友^
谎友^ 2020-12-28 12:32

I have the following query:

select distinct profile_id from userprofile_...

union

select distinct profile_id from productions_...

How wou

相关标签:
6条回答
  • 2020-12-28 12:58

    Best solution is to add count of two query results. It will not be a problem if the table contains large number of records. And you don't need to use union query. Ex:

    SELECT (select COUNT(distinct profile_id) from userprofile_...) + 
    (select COUNT(distinct profile_id) from productions_...) AS total
    
    0 讨论(0)
  • 2020-12-28 13:03

    These will not work if in one of the COUNT(*) the result is equals to 0.

    This will be better:

    SELECT SUM(total)
    FROM
    (
        select COUNT(distinct profile_id) AS total
        from userprofile_...
    
        union all
    
        select COUNT(distinct profile_id) AS total
        from productions_...
    ) x
    
    0 讨论(0)
  • 2020-12-28 13:04

    This will perform pretty well:

    select count(*) from (
        select profile_id
        from userprofile_...
        union
        select profile_id
        from productions_...
    ) x
    

    The use of union guarantees distinct values - union removes duplicates, union all preserves them. This means you don't need the distinct keyword (the other answers don't exploit this fact and end up doing more work).

    Edited:

    If you want to total number of different profile_id in each, where given values that appear in both table are considered different values, use this:

    select sum(count) from (
        select count(distinct profile_id) as count
        from userprofile_...
        union all
        select count(distinct profile_id)
        from productions_...
    ) x
    

    This query will out-perform all other answers, because the database can efficiently count distinct values within a table much faster than from the unioned list. The sum() simply adds the two counts together.

    0 讨论(0)
  • 2020-12-28 13:07

    If you want a total count for all records, then you would do this:

    SELECT COUNT(*)
    FROM
    (
        select distinct profile_id 
        from userprofile_...
    
        union all
    
        select distinct profile_id 
        from productions_...
    ) x
    
    0 讨论(0)
  • 2020-12-28 13:09

    you should use Union All if there are equals rows in both tables, because Union makes a distinct

    select count(*) from 
    (select distinct profile_id from userprofile_...
    
    union ALL
    
    select distinct profile_id from productions_...) x
    

    In this case, if you got a same Profile_Id in both tables (id is probably a number, so it's possible), then if you use Union, if you got Id = 1 in both tables, you will lost one row (it will appear one time instead of two)

    0 讨论(0)
  • 2020-12-28 13:10

    As omg ponies has already pointed out that there is no use of using distinct with UNION, you can use UNION ALL in your case.....

    SELECT COUNT(*) 
    FROM 
    ( 
    select distinct profile_id from userprofile_...
    union all
    select distinct profile_id from productions_...
    ) AS t1 
    
    0 讨论(0)
提交回复
热议问题