0

这里的问题是输出的前半部分没有返回 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)   
4

3 回答 3

2

问题是第二个 SELECT 在最后有一个额外的列。

系统给出的线索是 UNION 两侧的列数不一致。

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

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

于 2013-08-16T17:16:42.440 回答
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 到销售代表名称表,并完全删除 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
于 2013-08-18T13:55:29.520 回答
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 ALL 更有效(它不会尝试对您的结果进行重复数据删除)

正如 Ganders 指出的那样,这需要列匹配,在不知道您的架构的情况下很难提供答案。

于 2013-08-16T13:37:36.440 回答