Результат SQL-запроса из нескольких таблиц без дубликатов

У меня есть несколько таблиц с отфильтрованными из всех записей идентификаторами клиентов, датой последнего заказа и общей суммой заказа $, именем сегмента. Каждый фильтр основан на разных критериях, но один и тот же идентификатор клиента может принадлежать двум разным таблицам, двум разным сегментам. Один и тот же идентификатор будет иметь разные значения в Last Order и Total в . Сегменты, имена таблиц - A, B, C, D.

Мне нужно сгруппировать записи из всех таблиц сегментов таким образом, чтобы в наборе не было повторяющихся идентификаторов. то есть: если идентификатор появляется более чем в одной таблице (скажем, идентификатор 2 находится в таблицах A и B), набор результатов должен отображать столбцы идентификаторов из первой таблицы, таблицы A.

Поэтому мне нужно перечислить все записи и их значения столбцов из таблицы сегмента A, список всех записей и их значений из таблицы сегмента B, за исключением случаев, когда какой-либо идентификатор в таблице сегмента B находится в сегменте A и список всех записей из сегмента Таблица C, за исключением случаев, когда идентификатор из сегмента C находится в таблице сегмента A или B. Я надеюсь, что это имеет смысл.

Я представил это как вопрос из экзамена 70-461 :D Я довольно тщательно изучил его, но, возможно, я не понимаю, как задавать такие вопросы. Интересно, есть ли у кого-нибудь представление о том, как построить запрос, чтобы получить этот результат. Большое спасибо за любые предложения.

Спасибо ребята. У меня не получилось опубликовать скриншот. Позвольте мне попробовать ввести его через html. Есть и другие таблицы сегментов, но просто введите две, чтобы дать вам представление. Спасибо ребята!

Segment A
----------------------------------------
ID | Last Order Date  | Total  | Segment     
----------------------------------------
1  | 01/01/2012       | $1     |  A         
----------------------------------------
2  | 01/01/2012       | $1     |  A     
----------------------------------------              
3  | 01/01/2012       | $5     |  A     
----------------------------------------                 
6  | 01/01/2012       | $7     |  A     
----------------------------------------                 
8  | 01/01/2012       | $8     |  A  


Segment B

ID | Last Order Date | Total | Segment     
--------------------------------------
4  | 01/01/2010      | $3    |  B        
--------------------------------------
2  | 01/01/2010      | $5    |  B     
--------------------------------------            
1  | 01/01/2010      | $2    |  B     
--------------------------------------                
3  | 01/01/2010      | $1    |  B     
--------------------------------------                
5  | 01/01/2010      | $7    |  B  



Result Set

ID | Last Order Date | Total | Segment
--------------------------------------     
1  |    01/01/2012   |  $1   |    A         
--------------------------------------
2  |    01/01/2012   |  $1   |    A   
--------------------------------------                
3  |    01/01/2012   |  $5   |    A   
--------------------------------------                  
4  |    01/01/2010   |  $3   |    B   
--------------------------------------      
5  |    01/01/2010   |  $7   |    B  

person Thomas Pollack    schedule 19.01.2014    source источник
comment
Было бы намного быстрее, если бы вы показали нам таблицы и их столбцы, примеры данных и желаемый результат. Кроме того, вы также должны показать, какие усилия вы приложили для самостоятельного поиска решения, например, какие запросы вы пробовали.   -  person Radu Gheorghiu    schedule 19.01.2014
comment
Кажется, это идеальный сценарий для UNION. заявление.   -  person Wagner DosAnjos    schedule 19.01.2014


Ответы (1)


Вот кое-что для начала:

SELECT ID, LastOrderDate, Total, Segment
FROM SegmentA

UNION ALL
SELECT ID, LastOrderDate, Total, Segment
FROM SegmentB
WHERE ID NOT IN (SELECT ID FROM SegmentA)

UNION ALL
SELECT ID, LastOrderDate, Total, Segment
FROM SegmentC
WHERE ID NOT IN (SELECT ID FROM SegmentA)
AND ID NOT IN (SELECT ID FROM SegmentB)

UNION ALL
SELECT ID, LastOrderDate, Total, Segment
FROM SegmentD
WHERE ID NOT IN (SELECT ID FROM SegmentA)
AND ID NOT IN (SELECT ID FROM SegmentB)
AND ID NOT IN (SELECT ID FROM SegmentC)

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

person Timothy Walters    schedule 20.01.2014
comment
Большое спасибо за ваше время, Тимофей! Разве UNION ALL не будет включать дубликаты? Хотя это исправлено с ID NOT IN, поэтому мне не о чем беспокоиться. Что касается оптимизации, это будет необходимо, но эти таблицы так же просты, как я описал. ID — int, LastOrderDate — DATETIME, Total — Money, Segment nvarchar(5) - person Thomas Pollack; 20.01.2014