这里的问题是输出的前半部分没有返回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)
答案 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已经指出这需要匹配的列,因此很难在不知道您的架构的情况下提供答案。