来自多个表的SQL查询结果没有重复项

时间:2014-01-19 12:07:13

标签: sql sql-server tsql resultset multiple-tables

我有一些表格,从所有记录客户ID,最后订单日期和订单总计$,段名称中筛选出来。每个过滤器都基于不同的标准,但是,相同的客户ID可以属于两个不同的表,两个不同的段。相同的ID在Last Order和Total中具有不同的值。分段,表名是A,B,C,D。

我需要对所有段表中的记录进行分组,使得集合中没有重复的ID。即:如果一个ID出现在多个表中(比如ID 2在表A和B中),结果集必须显示第一个表A表中的ID列。

所以我需要列出来自Segment A表的所有记录及其列值,来自Segment B表的所有记录及其值的列表,除非Segment B表中的任何ID在Segment A中并且所有的列表中来自段C表的记录,除非段C中的ID在段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  

1 个答案:

答案 0 :(得分:0)

这是让你入门的东西:

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)

一个非常简单的答案,如果你想优化它,需要更多的信息。