将两个SQL语句与减法组合在一起

时间:2012-06-20 17:37:11

标签: sql vba

我有两个我希望结合的sql语句。我确信这可以使用某种类型的join命令来完成,但我不是很擅长使用它们,所以我希望有人可以从这里帮助。

我想从:

开始
SELECT DISTINCT CLOCFILEOT.CKEVNHM2.EVLEV1 AS WOSFROM 
FROM 
  CLOCFILEOT.CKEVNHM2, 
  (
    SELECT DISTINCT CONCAT('0',CPJDDTA81.F4801.WADOCO) AS WOS 
    FROM 
      CPJDDTA81.F4801,
      CPJDDTA81.F4102 
    WHERE 
          CPJDDTA81.F4102 .IBITM = CPJDDTA81.F4801.WAITM 
      AND CPJDDTA81.F4801.WASRST IN( '30', '45' ) 
      AND CPJDDTA81.F4102.IBSRP4 IN( 'ECT' )
      AND CPJDDTA81.F4801.WAMMCU = '      ECT001'
  ) SELECTEDWOS 
WHERE 
      CLOCFILEOT.CKEVNHM2.EVLEV1 = WOS 
  AND CLOCFILEOT.CKEVNHM2.EVLAB1 = 'E500'

并从该列表中减去所有内容:

SELECT DISTINCT CLOCFILEOT.CKEVNHM2.EVLEV1 AS WOSTOSUBTRACT 
FROM 
  CLOCFILEOT.CKEVNHM2, 
  (
    SELECT DISTINCT CONCAT('0',CPJDDTA81.F4801.WADOCO) AS WOS 
    FROM 
      CPJDDTA81.F4801, 
      CPJDDTA81.F4102 
    WHERE 
          CPJDDTA81.F4102.IBITM = CPJDDTA81.F4801.WAITM 
      AND CPJDDTA81.F4801.WASRST IN( '30', '45' ) 
      AND CPJDDTA81.F4102.IBSRP4 IN( 'CAB' )
      AND CPJDDTA81.F4801.WAMMCU = '      STH001'
  ) SELECTEDWOS 
WHERE 
  CLOCFILEOT.CKEVNHM2.EVLEV1 = WOS

我在adodb vba中这样做,这有时会限制所使用的sql命令的类型。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以使用EXCEPT

来处理此问题

如果这不是一个选项,您也可以尝试使用NOT IN

SELECT DISTINCT EVLEV1 AS WOSFROM 
FROM CLOCFILEOT.CKEVNHM2
   , 
   (
      SELECT DISTINCT CONCAT('0', WADOCO) AS WOS 
      FROM CPJDDTA81.F4801
         , CPJDDTA81.F4102 
      WHERE IBITM = WAITM 
         AND WASRST IN( '30', '45' ) 
         AND IBSRP4 IN( 'ECT' )
         AND WAMMCU = '      ECT001'
   ) AS SELECTEDWOS 
WHERE EVLEV1 = WOS 
   AND EVLAB1 = 'E500'
   AND EVLEV1 NOT IN
   (
      SubQuery Here
   )

答案 1 :(得分:0)

在第一个查询中......我不确定你为什么要进行交叉连接,并且不同于其中一个表格。你可以完全消除第二个表。如果你想要更好的答案......你必须让我们知道这些列来自哪个表。

您可以离开加入并查找空值

select <col a>
from <table A> 
left join <table B>
  on <col a> = <col b>
where <col b> is not null

或做..

select <col a>
from <table A>
where <col a> not in (
    select <col b>
    from <table B>)

答案 2 :(得分:0)

结合你们帮助和改变的东西,我为任何关心的人提供了解决方案:

SELECT WOSTO, AREATO, WOSFROM, STATIONFROM
FROM
(
   SELECT DISTINCT CONCAT('0', WADOCO) AS WOSTO, IBSRP4 AS AREATO
      , WOSFROM AS WOSFROM, PWOSFROM AS PWOSFROM, STATIONFROM AS STATIONFROM
   FROM CPJDDTA81.F4801
      , CPJDDTA81.F4102
      ,
      (
         SELECT DISTINCT EVLEV1 AS WOSFROM, EVLAB2 AS PWOSFROM
            , EVLAB1 AS STATIONFROM
         FROM CLOCFILEOT.CKEVNHM2
            ,
            (
               SELECT DISTINCT CONCAT('0', WADOCO) AS WOS
               FROM CPJDDTA81.F4801, CPJDDTA81.F4102
               WHERE IBITM = WAITM
                  AND WASRST IN( '30', '45' )
                  AND IBSRP4 IN( 'ECT' )
                  AND WAMMCU = '      ECT001'
            ) AS SELECTEDWOS
            WHERE EVLEV1 = WOS
               AND EVLAB1 = 'E500'
      ) AS ORIGINALWOS
      WHERE IBITM = WAITM
         AND WAPARS = PWOSFROM
         AND IBSRP4 = 'CAB'
         AND WAMMCU = '      STH001'
) AS SELECTEDWOS
LEFT JOIN CLOCFILEOT.CKEVNHM2 ON SELECTEDWOS.WOSTO = CLOCFILEOT.CKEVNHM2.EVLEV1
WHERE CLOCFILEOT.CKEVNHM2.EVLEV1 IS NULL
相关问题