Sql MS Access:转换数据库表以避免冗余

Sql MS Access:转换数据库表以避免冗余,sql,ms-access,Sql,Ms Access,我有一个包含两列的数据库表,如下所示: IMPORT_ID EXPORT_ID SI1313721 SI1440839 SI1313721 SI1440997 SI1313722 SI1440672 SI1313722 SI1440776 SI1313722 SI1441313 导入ID正在重复(SI1313721-2次和SI1313722-3次)。我想把这张桌子换成一张桌子 SI1313721 SI1440839 SI1440997 SI1313722 S

我有一个包含两列的数据库表,如下所示:

IMPORT_ID   EXPORT_ID
SI1313721   SI1440839
SI1313721   SI1440997
SI1313722   SI1440672
SI1313722   SI1440776
SI1313722   SI1441313
导入ID正在重复(SI1313721-2次和SI1313722-3次)。我想把这张桌子换成一张桌子

SI1313721   SI1440839   SI1440997
SI1313722   SI1440672   SI1440776  SI1441313

在MS Access中如何做到这一点?

转置没有支持,也没有分析功能可能很难做到。不确定,为什么你一开始就需要转换它。为了识别有问题的记录,您可以使用以下方法:

CREATE VIEW DuplicateImportID AS
  SELECT
    import_id
  FROM SomeTable
  GROUP BY import_id
  HAVING COUNT(export_id) > 1
;

CREATE VIEW ExportIDForDuplicateImportID AS
  SELECT
    D.import_id
    , S.export_id
  FROM DuplicateImportID D
  JOIN SomeTable S
    ON D.import_id = S.import_id
;

SELECT
  *
FROM ExportIDForDuplicateImportID
ORDER BY import_id, export_id
;
抱歉-我手边没有MS访问权限来验证/靠近。
在行动中看到它:

如果您真的需要将其转置,并且无法使用MS Access,您可能需要研究:

CREATE VIEW DuplicateImportID AS
  SELECT
    import_id
  FROM SomeTable
  GROUP BY import_id
  HAVING COUNT(export_id) > 1
;

CREATE VIEW ExportIDForDuplicateImportID AS
  SELECT
    D.import_id
    , S.export_id
  FROM DuplicateImportID D
  JOIN SomeTable S
    ON D.import_id = S.import_id
;

CREATE VIEW ExportIDForDuplicateImportID1 AS
  SELECT
    import_id
    , MIN(export_id) export_id
    , 1 level
  FROM ExportIDForDuplicateImportID
  GROUP BY import_id
;

CREATE VIEW ExportIDForDuplicateImportID2 AS
  SELECT
    E.import_id
    , MIN(E.export_id) export_id
    , 2 level
  FROM ExportIDForDuplicateImportID E
  LEFT JOIN ExportIDForDuplicateImportID1 E1
    ON E.import_id = E1.import_id
    AND E.export_id = E1.export_id
  WHERE E1.export_id IS NULL
  GROUP BY E.import_id
;

CREATE VIEW ExportIDForDuplicateImportID3 AS
  SELECT
    E.import_id
    , MIN(E.export_id) export_id
    , 3 level
  FROM ExportIDForDuplicateImportID E
  LEFT JOIN ExportIDForDuplicateImportID1 E1
    ON E.import_id = E1.import_id
    AND E.export_id = E1.export_id
  LEFT JOIN ExportIDForDuplicateImportID2 E2
    ON E.import_id = E2.import_id
    AND E.export_id = E2.export_id
  WHERE E1.export_id IS NULL
    AND E2.export_id IS NULL
  GROUP BY E.import_id
;

CREATE VIEW Transposed AS
  SELECT
    D.import_id
    , (SELECT export_id FROM ExportIDForDuplicateImportID1 WHERE import_id = D.import_id) export_id1
    , (SELECT export_id FROM ExportIDForDuplicateImportID2 WHERE import_id = D.import_id) export_id2
    , (SELECT export_id FROM ExportIDForDuplicateImportID3 WHERE import_id = D.import_id) export_id3
  FROM DuplicateImportID D
;
如本文所示。
不确定,MS Access将支持此功能-MySQL支持:


如果需要调整/进一步详细信息,请发表意见。

要根据您的需要进行转换,需要一些细微差别,包括重复次数的编号,然后使用子查询:

SomeQuery:

SELECT t1.IMPORT_ID, t1.EXPORT_ID 
   (SELECT COUNT(*) 
    FROM TableName AS t2
    WHERE t1.EXPORT_ID >= t2.EXPORT_ID 
     AND t1.IMPORT_ID = t2.EXPORT_ID) AS IDCount
FROM TableName AS t1;
转置查询:

SELECT DISTINCT main.IMPORT_ID,
  (SELECT q1.EXPORT_ID FROM SomeQuery AS q1 
   WHERE q1.IMPORT_ID = main.IMPORT_ID AND q1.IDCount= 1) AS EXPORT1,
  (SELECT q2.EXPORT_ID FROM SomeQuery AS q2 
   WHERE q2.IMPORT_ID = main.IMPORT_ID AND q2.IDCount= 2) AS EXPORT2,
  (SELECT q3.EXPORT_ID FROM SomeQuery AS q3 
   WHERE q3.IMPORT_ID = main.IMPORT_ID AND q3.IDCount= 3) AS EXPORT3
FROM SomeQuery AS main;

任何人使用Jet/ACE SQL方言的MS Access既不使用视图(而是保存的查询对象),也不使用
CREATE VIEW VIEW name AS SELECT…
语句。幸运的是,OP仍然可以通过将SELECT语句保存为与视图相同名称的存储查询来考虑您的解决方案。@ PARFIT感谢您的支持/输入!基本上:如果这是一个一次性或每月一次的作业,甚至可以将数据带到MySQL以用于此作业。或者是类似的。。。如果没有其他解决方法…我将面临错误,第二个代码-
创建视图ExportIDForDuplicateImportID,选择D.import\u id,从DuplicateImportID中选择S.export\u id,并在D.import\u id=S.import\u id上加入一些表S错误
来自caluse的语法错误
@Karvy1不
创建视图ExportIDForDuplicateImportID作为选择D.import\u id,S.export\u id FROM DuplicateImportID,其中D.import\u id=S.import\u id为您工作?SomeQuery的第一行可能以t1结尾。EXPORT_ID;-)的确谢谢@Abecee。每排最多3张吗?如果这个数字不知道呢?从第一个查询中找到<代码> IDCuth/Cuth>的最大值,并添加许多子查询(或者可以使用自连接查询),如果有点像20,考虑在VBA中循环,动态创建QueDeFF。