2013-04-06 5 views
-1

Я тратил много времени на googleing и искал хороший способ решить мою проблему, но ничего не могу найти.SQL Server и DISTINCT

У меня есть две таблицы: table1 и table2, и я хочу найти все уникальные письма в таблице1, которых нет в таблице2.

Первый запрос возвращает результат Int 1420, а второй запрос возвращает набор строк с общим количеством в 1431

Как это возможно? Думаю, это связано с тем, что я выбираю имя и статус?

select 
    Count(DISTINCT(Email)) 
from 
    table1 t1 
where 
    t1.siteId = 4 
    and t1.Email not in (select Email from table2 t2 where t2.SiteId = 4) 
go 

WITH MyPage AS 
(
    SELECT DISTINCT(t1.Email), 
     t1.Name, 
     t1.[Status], 
     ROW_NUMBER() OVER (partition by t1.Email ORDER BY t1.Name) AS Apperences, 
     ROW_NUMBER() OVER (ORDER BY t1.Name) AS RowNumber 
    FROM 
     table1 t1 
    WHERE 
     t1.siteId = 4 
     AND t1.Email NOT IN (SELECT Email FROM table2 t2 WHERE t2.SiteId = 4) 
) 
SELECT 
    Email, Name, [Status] 
FROM 
    MyPage 
WHERE 
    RowNumber => 0 and RowNumber <= 50000 

Я знаю, что я мог бы добавить «отчетливый» на последнем выбрать, но это было завинтить подкачки, что я хотел бы иметь ...

+1

[ 'DISTINCT'] (http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html) применяется ко всем столбцам в' п SELECT', независимо от того, имеются или нет эти круглые скобки. – Aiias

+0

Okey, так почему же возникает другой результат, когда я добавляю поле имени? Есть ли способ сделать это? Просто применить одно к одному полю? –

+0

Если у вас есть 2 разных имени с тем же адресом электронной почты, на который вы должны вернуться? –

ответ

1

Попробуйте это:

WITH MyPage 
AS 
    (SELECT 
     t1.Email, 
     t1.Name, 
     t1.[Status], 
     ROW_NUMBER() OVER (partition by t1.Email ORDER BY t1.Name) AS Apperences, 
     ROW_NUMBER() OVER (ORDER BY t1.Name) AS RowNumber 
    FROM table1 t1 
    WHERE t1.siteId = 4 
    and t1.Email not in (SELECT Email FROM table2 t2 where t2.SiteId=4) 
) 

SELECT Email, Name, [Status] 
FROM MyPage 
WHERE RowNumber => 0 and RowNumber <= 50000 
AND Apperences = 1 // this will give you the DISTINCT email 
0

Чтобы получить список всех отдельных писем и только одно имя, применяемое к нему, сначала создайте список всех отдельных писем с образцом (я использую последний в алфавитном порядке), а затем использую эту таблицу в качестве базы для добавления дополнительной информации , Однако результат, особенно номера строк, будет бесполезным.

WITH MyPage AS 
     (SELECT t1.Email, 
     t1.Name, 
     t1.[Status], 
     ROW_NUMBER() OVER (partition by t1.Email ORDER BY t1.Name) AS Apperences, 
     ROW_NUMBER() OVER (ORDER BY t1.Name) AS RowNumber 
     FROM 
      (select x.Email, max(Name) as name 
      from table1 t1 
      where t1.siteId = 4 
       and t1.Email not in (
       SELECT Email FROM table2 t2 where t2.SiteId=4 
      ) 
      group by x.Email 
     ) t1 
    SELECT Email, Name, [Status] 
    FROM MyPage 
    WHERE RowNumber => 0 and RowNumber <= 50000 
Смежные вопросы