使用 ODBC、联接和分组依据的 SQL 查询

KNG*_*KNG 3 ms-access odbc iseries

我对下面的声明有疑问。查询的主要目的是将客户列表从 ODBC 提取到 Access 数据库中(我们的客户存储在 IBM i 上的 DB2 中)。该查询旨在查找超过 13 个月未交付 (RS2101F.DELDATE) 但尚未被抑制 (OM01U1.OM01068) 的客户 (OM01U1.OM01015)。我确实需要所有的列来研究设备和财务记录,所以我无法移除它们。不过,该声明是从几个表中提取的。我认为问题可能出在“Group By”上。当我收到结果时,我也得到了重复的出口 (OM01U1.OM01015)。我只需要看到最后一次交货日期 (RS2101F.DELDATE) 一次。请不要把我打得太糟,我没有创建这个查询,我只是继承了它。我知道这很遥远,而且可能有更好的方法来获取我需要的信息。我感谢任何帮助家伙!

SELECT
    OM01U1.OM01041 as Loc,
    OM01U1.OM01015 AS Outlet, 
    OM01U1.OM01945 AS OLTyp,
    OM01U1.OM01052 AS Outlet_Name,
    OM01U1.OM01054A AS Street_Number, 
    OM01U1.OM01054C AS Street_Name, 
    OM01U1.OM01055A AS City, 
    OM01U1.OM01055B AS State, 
    OM01U1.OM01106 AS Zip, 
    OM01U1.OM01058A AS Area_Code, 
    OM01U1.OM01058C AS Phone, 
    OM01U1.OM01037 AS Channel, 
    OM01U1.OM01926 AS USA_Type,
    OM01U1.OM01078 AS Key_Acct, 
    OM01U1.OM01110 AS TRDGRP,
    OM01U1.OM01034 AS Trade_Name, 
    OM01U1.OM01248 AS DTC,
    OM01U1.OM01073 AS Sales_Route, 
    OM01U1.OM01068 AS Sup_CDE, 
    OM01U1.OM01982 AS Sup_Reason, 
    OM01U1.OM01067 AS Sup_Date, 
    OM01U1.OM01065 AS Creation_DT, 
    OM01U1.OM01066 AS Update_DT, 
    OM01U1.OM01141 AS CAN_NUM,
    CF30_CNSTYP AS CF_CONTYP, 
    EC01_EQUNUM AS EC_EQUIP,
    EC01_PRMSLR AS EC_SUPPLIER, 
    EC01_EQUOWN AS EC_OWN_CD,
    EC01_EQUACY AS EC_ACCESSORY,
    EC01_EQUSPP AS EC_COMPONENT,
    EC01_SYSSTA AS EC_STATUS,
    EC01_ISTDAT AS EC_INSTALL_DT, 
    EC01_RSPPRN AS EC_PERSON, 
    EC01_LASMTCDAT AS EC_LAST_MNT_DT, 
    OC02_RNTCTCNUM AS OC_CONT_NUM, 
    OC02_RNTCTCSTA AS OC_CONT_STATUS, 
    OC02_BTONUM AS OC_BILL_TO, 
    RS2101F.DELDATE AS RS_LAST_DEL_DT
  FROM 
    CF30, EC01, OC02, OM01U1, RS2101F
  WHERE 
    OM01U1.OM01015 = RS2101F.OUTNUM

  GROUP BY
    RS2101F.DELDATE,
    OC02_BTONUM,
    OC02_RNTCTCSTA,
    OC02_RNTCTCNUM,
    OC02_OUTNUM,
    EC01_LASMTCDAT,
    EC01_RSPPRN,
    EC01_ISTDAT,
    EC01_EQUOWN,
    EC01_EQUACY,
    EC01_EQUSPP,
    EC01_SYSSTA,
    EC01_PRMSLR,
    EC01_EQUNUM,
    CF30_CNSTYP,
    OM01U1.OM01141,
    OM01U1.OM01066,
    OM01U1.OM01065,
    OM01U1.OM01067,
    OM01U1.OM01982,
    OM01U1.OM01068,
    OM01U1.OM01073,
    OM01U1.OM01248,
    OM01U1.OM01034,
    OM01U1.OM01110,
    OM01U1.OM01078,
    OM01U1.OM01926,
    OM01U1.OM01037,
    OM01U1.OM01058C,
    OM01U1.OM01058A,
    OM01U1.OM01106,
    OM01U1.OM01055B,
    OM01U1.OM01055A,
    OM01U1.OM01054C,
    OM01U1.OM01054A,
    OM01U1.OM01052,
    OM01U1.OM01945,
    OM01U1.OM01015,
    OM01U1.OM01041
  HAVING  RS2101F.DELDATE < 1110809
      AND OM01U1.OM01068<>'S' 
Run Code Online (Sandbox Code Playgroud)

Rem*_*mou 5

您有一个有效的查询,但您正在选择:

FROM CF30, EC01, OC02, OM01U1, RS2101F 
Run Code Online (Sandbox Code Playgroud)

没有显式连接,只有一个隐式连接:

WHERE OM01U1.OM01015 = RS2101F.OUTNUM
Run Code Online (Sandbox Code Playgroud)

这将导致问题。您能找到每个表中的哪些字段(列)与哪些字段(列)匹配吗?然后你可以说:

FROM OM01U1 
INNER JOIN RS2101F
ON OM01U1.OM01015 = RS2101F.OUTNUM
Run Code Online (Sandbox Code Playgroud)

例如。

您可能还会发现添加派生表很有用:

SELECT OUTNUM, Max(RS2101F.DELDATE) FROM RS2101F
Run Code Online (Sandbox Code Playgroud)

所以那将是:

FROM OM01U1 
INNER JOIN (
     SELECT OUTNUM, Max(RS2101F.DELDATE) 
     FROM RS2101F
     GROUP BY OUTNUM) As t
ON OM01U1.OM01015 = t.OUTNUM
Run Code Online (Sandbox Code Playgroud)