Удалить повторяющиеся строки из запроса SQL UNION

У меня есть следующий запрос объединения, из которого я пытаюсь удалить повторяющиеся строки:

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 с нулями из моего набора результатов.

Возможно ли это сделать с помощью запроса на объединение?


person David    schedule 24.01.2015    source источник
comment
вам придется выполнить дедупликацию после оператора объединения, но если вы хотите удалить строки со значениями NULL, вы делаете это в своем предложении WHERE.   -  person Beth    schedule 24.01.2015
comment
вы должны показать ожидаемый результат по сравнению с текущим результатом, который вы получаете, который вы показали выше, ваш ожидаемый результат не ясен для нас   -  person null    schedule 24.01.2015


Ответы (2)


как я понял вопрос, вам вообще не нужен 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
person null    schedule 24.01.2015
comment
Ваше предложение where отменяет left join. - person Gordon Linoff; 24.01.2015
comment
@GordonLinoff, ответ отредактирован, также вы можете поместить предложение where вне запроса (сделать как подзапрос) - person null; 24.01.2015
comment
AND st.Abbr = 'MI' по-прежнему отменяет внешнее соединение ул. Он должен быть в состоянии соединения. - person Sebas; 24.01.2015
comment
Ответ @Sebas отредактирован, но я думаю, что в этом случае лучший способ - вывести предложение where за пределы запроса, например select * from (select tbla.a as a, tblb.b as b from tbla left outer join tblb on tbla.id=tblb.id) where b='some value' - person null; 24.01.2015
comment
также я думаю, что the idea of using left join важна не деталь запроса, которой владелец вопроса может манипулировать им - person null; 24.01.2015

Ответ Фарханга в порядке. Но правильный способ написать запрос — поместить условие 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.

person Gordon Linoff    schedule 24.01.2015
comment
Отличный ответ. Я использую встроенный элемент управления Kentico CMS, поэтому мне нужно, чтобы условие where было полным оператором, чтобы оно работало с Kentico. - person David; 25.01.2015