【问题标题】:Syntax Error during inner join of two select statements两个选择语句的内部连接期间的语法错误
【发布时间】:2016-05-27 06:44:45
【问题描述】:

下面的 sql 查询在内部连接部分有一些错误,这是错误消息:

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 'AS INNER JOIN (SELECT SERIAL_NO FROM STOCK.WAREHOUSE_MVT_LINE mvtLn INNER ' 在第 3 行

SELECT
  wm.CID,
  wm.DOC_ID,
  wm.DOC_TYPE,
  wml.SERIAL_NO,
  wml.WH_MVT_NO,
  wm.PROD_ID,
  wm.LOT_CODE,
  wm.WH_CODE,
  wm.BIN_CODE,
  wml.MVT_DATE,
  wm.BATCH_NO,
  wm.MVT_TYPE,
  wm.PROD_NAME,
  wm.COMMENT,
  wm.REMARK,
  wm.NOTE,
  wm.INSTRUCTION 
FROM
  STOCK.WAREHOUSE_MVT_LINE wml 
INNER JOIN
  STOCK.WAREHOUSE_MVT wm 
    ON wml.CID=wm.CID 
    AND wml.WH_MVT_NO=wm.WH_MVT_NO 
WHERE
  wml.CID = 70200009 
  AND (
    wm.MVT_TYPE != 'TFOUT' 
    AND wm.MVT_TYPE != '3TFOUT'
  )     
  AND wml.SERIAL_NO IN (
    (
      SELECT
        SERIAL_NO 
      FROM
        STOCK.WAREHOUSE_MVT_LINE mvtLn 
      INNER JOIN
        STOCK.WAREHOUSE_MVT mvt 
          ON mvtLn.CID = mvt.CID 
          AND mvtLn.PFC_CODE = mvt.PFC_CODE 
          AND mvtLn.WH_MVT_NO = mvt.WH_MVT_NO 
      where
        mvtLn.CID = 70200009 
        AND mvtLn.PFC_CODE ='SG' 
        AND mvtLn.MVT_DATE >= '2016-04-01 00:00:00.0' 
        AND mvtLn.MVT_DATE <='2016-06-30 00:00:00.0'  
        AND mvt.WH_CODE = 'IDJKT' 
        AND mvt.BIN_CODE = 'IMP'
    )AS a     
  INNER JOIN
    (
      SELECT
        SERIAL_NO 
      FROM
        STOCK.WAREHOUSE_MVT_LINE mvtLn 
      INNER JOIN
        STOCK.WAREHOUSE_MVT mvt 
          ON mvtLn.CID = mvt.CID 
          AND mvtLn.PFC_CODE = mvt.PFC_CODE 
          AND mvtLn.WH_MVT_NO = mvt.WH_MVT_NO 
      where
        mvtLn.CID = 70200009 
        AND mvtLn.PFC_CODE ='SG' 
        AND mvtLn.MVT_DATE >= '2016-01-01 00:00:00.0' 
        AND mvtLn.MVT_DATE <='2016-03-31 00:00:00.0'  
        AND mvt.WH_CODE = 'CL' 
        AND mvt.BIN_CODE = 'PSADEPOT'
    )AS b 
      ON a.SERIAL_NO = b.SERIAL_NO
    )  
    AND wm.MVT_DATE  BETWEEN '2016-01-01 00:00:00.0' AND '2016-06-30 00:00:00.0'  
ORDER BY
  wml.SERIAL_NO,
  wml.MVT_DATE

【问题讨论】:

  • 查询完全无法调试 :) 尝试通过删除调试所需的部分来简化它。

标签: mysql join


【解决方案1】:

你想要这个吗?

SELECT wm.CID, wm.DOC_ID, wm.DOC_TYPE, wml.SERIAL_NO, wml.WH_MVT_NO
    , wm.PROD_ID, wm.LOT_CODE, wm.WH_CODE, wm.BIN_CODE, wml.MVT_DATE
    , wm.BATCH_NO, wm.MVT_TYPE, wm.PROD_NAME, wm.COMMENT, wm.REMARK
    , wm.NOTE, wm.INSTRUCTION
FROM STOCK.WAREHOUSE_MVT_LINE wml INNER JOIN STOCK.WAREHOUSE_MVT wm ON wml.CID = wm.CID
AND wml.WH_MVT_NO = wm.WH_MVT_NO
WHERE wml.CID = 70200009
    AND wm.MVT_TYPE != 'TFOUT'
    AND wm.MVT_TYPE != '3TFOUT'
    AND wml.SERIAL_NO IN (
            SELECT a.SERIAL_NO FROM -- You missed this. I thought....
            (
                SELECT SERIAL_NO
                FROM STOCK.WAREHOUSE_MVT_LINE mvtLn
                INNER JOIN STOCK.WAREHOUSE_MVT mvt
                ON mvtLn.CID = mvt.CID
                AND mvtLn.PFC_CODE = mvt.PFC_CODE
                AND mvtLn.WH_MVT_NO = mvt.WH_MVT_NO
                WHERE mvtLn.CID = 70200009
                AND mvtLn.PFC_CODE = 'SG'
                AND mvtLn.MVT_DATE >= '2016-04-01 00:00:00.0'
                AND mvtLn.MVT_DATE <= '2016-06-30 00:00:00.0'
                AND mvt.WH_CODE = 'IDJKT'
                AND mvt.BIN_CODE = 'IMP'
            ) a
            INNER JOIN (
                SELECT SERIAL_NO
                FROM STOCK.WAREHOUSE_MVT_LINE mvtLn
                INNER JOIN STOCK.WAREHOUSE_MVT mvt
                ON mvtLn.CID = mvt.CID
                AND mvtLn.PFC_CODE = mvt.PFC_CODE
                AND mvtLn.WH_MVT_NO = mvt.WH_MVT_NO
                WHERE mvtLn.CID = 70200009
                AND mvtLn.PFC_CODE = 'SG'
                AND mvtLn.MVT_DATE >= '2016-01-01 00:00:00.0'
                AND mvtLn.MVT_DATE <= '2016-03-31 00:00:00.0'
                AND mvt.WH_CODE = 'CL'
                AND mvt.BIN_CODE = 'PSADEPOT'
            ) b ON a.SERIAL_NO = b.SERIAL_NO )
    AND wm.MVT_DATE BETWEEN '2016-01-01 00:00:00.0' AND '2016-06-30 00:00:00.0'
ORDER BY wml.SERIAL_NO, wml.MVT_DATE

【讨论】:

  • 是的,我错过了那部分,但我得到 serial_no 是模棱两可的错误,并且在我在两个 select 语句之外放置一个括号并将其设置为 c 和 c.SERIAL_NO 之后它在 c 处引发语法错误
  • 我已经修复了serial_no is ambiguous error。请再检查一遍。
  • 我只是担心它会从a中获取序列号,但在inner join之后不会
  • 不,INNER JOIN 将在a.SERIAL_NO = b.SERIAL_NO 条件下获取与ab 匹配的记录。你可以运行这个子查询并检查它。
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多