2015-01-24 2 views
0

У меня есть следующий союз запрос, который я пытаюсь удалить повторяющиеся строки из:Удаление повторяющихся строк из SQL UNION Query

SELECT DISTINCT c.Cat_Name, s.SubCat_DisplayName, st.State, COUNT(a.SubCategory_ID) as SubCount 
FROM CT_SubCategory s 
INNER JOIN CT_Category c ON s.Cat_ID=c.Cat_ID 
INNER JOIN CT_AdvertiserSubcategory a ON s.Subcat_ID = a.SubCategory_ID 
INNER JOIN CT_AdvertiserCity ac ON ac.UserID = a.UserID 
INNER JOIN CT_City ci ON ci.City_ID = ac.City_ID 
INNER JOIN CT_State st ON ci.State_ID = st.State_ID 
WHERE ci.CityName LIKE 'Grand-Rapids' AND st.Abbr = 'MI' 
GROUP BY c.Cat_Name, s.SubCat_Name, s.SubCat_DisplayName, st.State 
UNION 
SELECT c.Cat_Name, s.SubCat_Name, s.SubCat_DisplayName, null, null 
FROM CT_SubCategory s 
INNER JOIN CT_Category C ON s.Cat_ID = c.Cat_ID 
ORDER BY SubCat_DisplayName 

Текущих результатов:

Auto, Auto Repair, null, null 
Auto, Auto Repair, Michigan, 3 
Entertainment, Events, null, null 
Gifts, Flowers, null, null 

желаемых результатов:

Auto, Auto Repair, Michigan, 3 
Entertainment, Events, null, null 
Gifts, Flowers, null, null 

Я хотел бы удалить дублируемую строку Auto Repair с нулями из моего результирующего набора.

Можно ли сделать запрос на объединение?

+0

Вы должны будете дедупировать после утверждения union, но если вы хотите удалить строки с NULL-значениями, вы делаете это в своем предложении WHERE – Beth

+0

, вам нужно показать ожидаемый результат в сравнении с текущим результатом, который вы получаете, вы показали выше, ваш результат ожидания для нас непонятен – jfun

ответ

1

как я понял вопрос, вам не нужно UNION вообще вы должны использовать LEFT OUTER JOIN;

SELECT DISTINCT c.Cat_Name, s.SubCat_DisplayName, st.State, COUNT(a.SubCategory_ID) as SubCount 
FROM CT_SubCategory s 
INNER JOIN CT_Category c ON s.Cat_ID=c.Cat_ID 
LEFT OUTER JOIN CT_AdvertiserSubcategory a ON s.Subcat_ID = a.SubCategory_ID 
LEFT OUTER JOIN CT_AdvertiserCity ac ON ac.UserID = a.UserID 
LEFT OUTER JOIN CT_City ci ON ci.City_ID = ac.City_ID 
LEFT OUTER JOIN CT_State st ON ci.State_ID = st.State_ID 
WHERE ISNULL(ci.CityName,'Grand-Rapids') LIKE 'Grand-Rapids' AND ISNULL(st.Abbr,'MI') = 'MI' 
GROUP BY c.Cat_Name, s.SubCat_Name, s.SubCat_DisplayName, st.State 

и результат должен быть таким:

Auto, Auto Repair, Michigan, 3 
Entertainment, Events, null, null 
Gifts, Flowers, null, null 
+1

Предложение 'where' отменяет' left join'. –

+0

@GordonLinoff, отредактированный ответ, также вы можете поместить предложение where вне запроса (сделать как подзапрос) – jfun

+0

'AND st.Abbr = 'MI'' все еще отменяет внешнее соединение st. Он должен быть в состоянии соединения. – Sebas

0

ответ Фархангу в порядке. Но правильный способ написать запрос, чтобы поставить условие where в предложении on:

SELECT DISTINCT c.Cat_Name, s.SubCat_DisplayName, st.State, 
     COUNT(a.SubCategory_ID) as SubCount 
FROM CT_SubCategory s INNER JOIN 
    CT_Category c 
    ON s.Cat_ID = c.Cat_ID LEFT OUTER JOIN 
    CT_AdvertiserSubcategory a 
    ON s.Subcat_ID = a.SubCategory_ID LEFT OUTER JOIN 
    CT_AdvertiserCity ac 
    ON ac.UserID = a.UserID LEFT OUTER JOIN 
    CT_City ci 
    ON ci.City_ID = ac.City_ID AND 
     ci.CityName = 'Grand-Rapids' LEFT OUTER JOIN 
    CT_State st 
    ON ci.State_ID = st.State_ID AND 
     st.Abbr = 'MI' 
GROUP BY c.Cat_Name, s.SubCat_Name, s.SubCat_DisplayName, st.State; 

ISNULL() (или, как я предпочитаю COALESCE()) возвращает неожиданные результаты, если CityName или Abbr когда-либо в данных NULL. Для фильтрации в правой таблице в left join вы должны поместить условия в пункт on.

:
+0

Отличный ответ. Я использую встроенный элемент управления Kentico CMS, поэтому мне нужно, чтобы условия были в качестве полного заявления для его работы с Kentico – David

Смежные вопросы