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。