必须结合2个查询

时间:2013-08-16 13:34:35

标签: sql crystal-reports ibm-midrange db2-400

这里的问题是输出的前半部分没有返回WWDTA的数据,但肯定有匹配。我们在此查询的第二部分中所做的就是获取销售代表ID并获取销售代表名称以在报告中显示。

CREATE VIEW astccdta.acwocmpk AS (                             
SELECT                                                         
  ALL       T01.OHORD#, T01.OHSLR#,T01.OHORDT, T01.OHORDD,     
T01.OHTTN$,  '                    ' as WWDTA                   
  FROM      ASTDTA.OEORHDOH  T01,                              
            ASTDTA.OETRANOT  T02                               
  WHERE     T01.OHORD# = T02.OTORD#                            
    AND(    T02.OTTRNC = 'WOC')                                
and T01.OHORDD > 20120101                                      
UNION ALL                                                      
SELECT                                                         
  ALL       T01.OHORD#, T01.OHSLR#, T01.OHORDT, T01.OHORDD,    
T01.OHTTN$,                                                    
            SUBSTR(RFDTA,1,20) AS WWDTA                        
  FROM      ASTCCDTA.WOCREPS T01,                              
            ASTCCDTA.REPREF1 T02                               
   WHERE     T01.OHSLR# = T02.RFSLC)   

3 个答案:

答案 0 :(得分:2)

问题是第二个SELECT在末尾有一个额外的列。

系统给你的线索是UNION双方之间的列数不一致。

在第一个SELECT列表的末尾添加一个额外的空char(20)列以匹配它,那么你应该没问题。但请检查第一个SELECT中的每一列是否与第二个中的相应列匹配,它们以相同的顺序出现。

正如其他人指出的那样,你可能想要UNION ALL。

答案 1 :(得分:1)

UNION的作用是获取两个单独的SELECT语句,并将它们组合在一个结果集中,一个接一个。说你的第一个SELECT带回来:

1 A 2013-08-01 100.00 ''
2 B 2013-08-02 200.00 ''
3 A 2013-08-03 300.00 ''

并且你的第二个SELECT回来了:

1 A 2013-08-01 100.00 'John Smith'
2 B 2013-08-02 200.00 'Jane Jones'
3 A 2013-08-03 300.00 'John Smith'

当你联合他们时,你会得到:

1 A 2013-08-01 100.00 ''
2 B 2013-08-02 200.00 ''
3 A 2013-08-03 300.00 ''
1 A 2013-08-01 100.00 'John Smith'
2 B 2013-08-02 200.00 'Jane Jones'
3 A 2013-08-03 300.00 'John Smith'

我认为您想要将第一个SELECT更改为JOIN到sales rep name表并删除UNION和第二个SELECT:

SELECT ALL 
  T01.OHORD#, T01.OHSLR#,T01.OHORDT, T01.OHORDD, T01.OHTTN$, SUBSTR(RFDTA,1,20) AS WWDTA
FROM ASTDTA.OEORHDOH T01,
     ASTDTA.OETRANOT T02,
     ASTCCDTA.REPREF1 T03
WHERE T01.OHORD# = T02.OTORD#
 AND (T02.OTTRNC = 'WOC')
 and  T01.OHORDD > 20120101
 and  T01.OHSLR# = T03.RFSLC

答案 2 :(得分:0)

在MS SQL Server中,您可以使用union关键字

SELECT                                                                        
  ALL       T01.OHORD#, T01.OHORDT, T01.OHORDD, T01.OHSLR#, T01.OHTTN$        
  FROM      ASTDTA/OEORH1 T01,                                                
            ASTCCDTA/OETRA99 T02                                              
  WHERE     T01.OHORD# = T02.OTORD#                                           
    AND(    T02.OTTRNC = 'WOC')      

UNION

SELECT                                                                              
  ALL       T01.OHORD#, T01.OHORDT, T01.OHORDD, T01.OHSLR#, T01.OHTTN$        
            SUBSTR(RFDTA,1,20) AS WWDTA                                             
  FROM      PKLIB/WOCREPS T01,                                                      
            PKLIB/PHILREF1 T02                                                      
  WHERE     T01.OHSLR# = T02.RFSLC   

如果您的数据包含重复项,请使用Union,否则UNION ALL会更有效(它不会尝试重复数据删除结果)

由于Ganders已经指出这需要匹配的列,因此很难在不知道您的架构的情况下提供答案。