14

I'm trying to get all distinct values across 2 tables using a union.

The idea is to get a count of all unique values in the columnA column without repeats so that I can get a summation of all columns that contain a unique columnA.

This is what I tried (sql server express 2008)

select 
    count(Distinct ColumnA) 
from 
( 
    select Distinct ColumnA as ColumnA from tableX where x = y
    union
    select Distinct ColumnA as ColumnA from tableY where y=z
)
afuzzyllama
  • 6,538
  • 5
  • 47
  • 64
rockit
  • 3,708
  • 7
  • 26
  • 36

4 Answers4

23
SELECT COUNT(distinct tmp.ColumnA) FROM ( (SELECT ColumnA FROM TableX WHERE x=y) 
UNION (SELECT ColumnA FROM TableY WHERE y=z) ) as tmp

The extra distincts on TableX and TableY aren't necessary; they'll get stripped in the tmp.ColumnA clause. Declaring a temporary table should eliminate the ambiguity that might've prevented your query from executing.

Jim Dagg
  • 2,044
  • 22
  • 29
17
SELECT COUNT(*)
FROM
(
SELECT DISTINCT ColumnA From TableX WHERE x = y
UNION
SELECT DISTINCT ColumnA From TableY WHERE y = z
) t

Using a "UNION" will not return duplicates. If you used "UNION ALL" then duplicate ColumnA values from each table WOULD be return.

AdaTheDev
  • 142,592
  • 28
  • 206
  • 200
  • 3
    DISTINCT isn't necessary because of the UNION, which removes duplicates. `UNION ALL` does **not** remove duplicates – OMG Ponies Dec 11 '09 at 21:46
  • True - I just thought including the distinct in there might be more performant (execution plan is different) - would require a bit more testing to prove/disprove that. Re: UNION ALL, that is what I said :) – AdaTheDev Dec 11 '09 at 21:52
4

To get distinct values in Union query you can try this

Select distinct AUnion.Name,AUnion.Company from (SELECT Name,Company from table1 UNION SELECT Name,Company from table2)AUnion
Prateek Gupta
  • 880
  • 1
  • 10
  • 21
2
SELECT DISTINCT Id, Name
FROM   TableA
UNION ALL
SELECT DISTINCT Id, Name
FROM   TableB
WHERE  TableB.Id NOT IN (SELECT Id FROM TableA)
Observer
  • 3,506
  • 1
  • 16
  • 32