【问题标题】:ACCESS/SQL - Create query that combines all unique records from multiple tablesACCESS/SQL - 创建组合来自多个表的所有唯一记录的查询
【发布时间】:2019-05-15 04:28:03
【问题描述】:

我有三个表,只有一个公共字段 [Asset]。

一个表 [tblAssets] 包含我想要的所有字段。

但是,我想检查其他两个表并添加任何未出现在第一个表中的 [Asset]。

这将导致新记录仅包含 [Asset],其余字段为空白。

我目前的代码如下:

SELECT *, "Assets" AS [Source]
FROM [tblAssets]
UNION SELECT "BOM", [Asset], NULL, NULL, NULL, NULL, NULL, NULL
FROM [tblBOM]
UNION SELECT "WO", [Asset], NULL, NULL, NULL, NULL, NULL, NULL
FROM [tblWO];

这会按预期添加记录,但不会删除重复项,因为整个记录不是重复项。

我怀疑还有其他方法可以解决这个问题,例如在某些条件下附加查询。

为了澄清,我想要显示在多个数据源中的所有 [Asset] 的完整列表,但只有 [Assets] 表中显示的其余字段。

样本数据:

tblAssets -

       Asset  Type  Unit  
         P1     2    1
         M1     1    2

tblBOM -

       Comp   Asset  Qty
         1      P1     1
         2      P2     2

tblWO -

         WO    Asset  Cost
         1      P1     100
         2      C1     200

电流输出

        Source  Asset  Type   Unit  
        Assets   P1     2       1    
        Assets   M1     1       2   
         BOM     P1                  
         BOM     P2                 
         WO      P1                
         WO      C1                   

期望的输出

        Source  Asset  Type   Unit 
        Assets   P1     2       1    
        Assets   M1     1       2                 
         BOM     P2                               
         WO      C1                   

【问题讨论】:

  • 请提供样本数据和期望的结果。
  • @Gordon 已添加,谢谢
  • 只需使用 where [Asset] not in (SELECT Asset from tblAssets) 和其他 2 个表类似。
  • @xQbert 感谢您的回复,我刚刚尝试过,结果只从 tblAsset 中记录。我对 SQL 比较陌生,所以我可能弄错了语法或位置。为了澄清,我应该在“FROM [tblBOM]”和“FROM [tblWO]”之后输入您建议的代码?另外,如果 [Asset] 同时出现在 tblBOM 和 tblWO 中怎么办?在这种情况下,我不在乎 [Source] 中出现什么,只希望记录出现。
  • 要输入的来源是哪一列,在 2 个联合的开头和资产的末尾都有。做不到。

标签: sql ms-access duplicates union


【解决方案1】:

从表tblBOMtblWO 中选择表tblAssets 中不存在的Asset 的所有不同值:

SELECT "Assets" AS [Source], * FROM [tblAssets]
UNION 
SELECT "BOM" AS [Source], [Asset], NULL, NULL, NULL, NULL, NULL, NULL FROM [tblBOM]
WHERE [Asset] NOT IN (SELECT DISTINCT [Asset] FROM [tblAssets])
UNION 
SELECT "WO" AS [Source], [Asset], NULL, NULL, NULL, NULL, NULL, NULL FROM [tblWO]
WHERE [Asset] NOT IN (SELECT DISTINCT [Asset] FROM [tblAssets])

【讨论】:

    【解决方案2】:
    • 包括资产中的所有内容:
    • 只有来自 tblBOM 的那些不在 assets 中,也不在 tblWO 中
    • 以及所有来自 tblWO 的不在资产中的人

    .

    SELECT "Assets" AS [Source], A.*
    FROM [tblAssets] A
    UNION SELECT "BOM", [Asset], NULL, NULL, NULL, NULL, NULL, NULL
    FROM [tblBOM]
    WHERE [Asset] not in (SELECT Asset FROM tblAssets)
      and [Asset] not in (SELECT ASSET FROM [tblWO])
    UNION SELECT "WO", [Asset], NULL, NULL, NULL, NULL, NULL, NULL
    FROM [tblWO]
    WHERE [Asset] not in (SELECT Asset FROM tblAssets)
    

    【讨论】:

    • 好的 6 月怎么样?我的防火墙阻止我发布联盟这个词? (无论如何谢谢)
    • 不知道。我曾经在另一个论坛网站上看到过这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多