【问题标题】:Select distinct values from two different columns of two tables with other non-distinct columns从具有其他非不同列的两个表的两个不同列中选择不同的值
【发布时间】:2017-11-11 23:48:39
【问题描述】:

我正在尝试从由两个表组成的 Access 数据集中消除重复行。我想从两个表的一列中检索不同的值,同时也检索其他列的重复值和唯一值。

我想要唯一值的字段是 table2 中的 [PART-SN]。我想从表 1 中选择所有其他字段,并从表 2 中选择 [PART-SN],其中所有行都应为 [PART-SN] 的所有不同行返回。 [PART FIND NO] 和 [PART-ATA-NO] 具有相同的值并具有重复项。我看过有关如何从同一列的两个表中获取值的帖子。有没有办法连接这两个表来得到这个结果?

样本数据(非实际数据):

表 1:

ID  BOM_PART_NAME  PART FIND NO  POS  LCN  POS_CT   
1       E              0001       1    P0    1
2       A              0002       1    P1    1
3       C              0003       1    P2    1
4       D              0004       1    P3    1
5       F              0005       1    P4    1

表 2:

ID  PART-ATA-NO    PART-SN     PART-NAME
1      001                         A
2      002                         B
3      003                         C
4      004          1100           D
5      005          1101           E

ID  BOM_PART_NAME  PART FIND NO  POS  LCN  POS_CT   
1       E              0001       1    P0    1
2       A              0002       1    P1    1
3       C              0003       1    P2    1
4       D              0004       1    P3    1
5       F              0005       1    P4    1

表 2:

ID  PART-ATA-NO    PART-SN     PART-NAME
1      001                         A
2      002                         B
3      003                         C
4      004          1100           D
5      005          1101           E

我得到了什么:

ID ... PART FIND NO       POS       PART-ATA-NO   PART-SN
1        001              1           001          1369
2        002              1           002          1444
3        003              1           003          1100
3        003              1           003          1101  
3        003              1           003          1102
4        003              2           003          1101
4        003              2           003          1102
5        004              1           004          1101
5        004              1           004          1102

期望的结果:

ID    PART FIND NO       POS      PART-ATA-NO     PART-SN
1        001              1           001          1369
2        002              1           002          1444
3        003              1           003          1100
4        003              2           003          1101  
5        003              3           003          1102
6        003              4           003          1103
7        003              5           003          1104
8        004              1           004          1105
9        004              2           004          1106

【问题讨论】:

  • 对不起,我不明白。你能给我们一个包含键和所有东西的最小表定义吗? [PART FIND NO] 和 [PART-ATA-NO] UNIQUE 列、PRIMARY KEY 列、FOREIGN KEY 列还是什么?另外,您是否提出了一些尚未完成的解决方案或解决方案的一部分?这会很有帮助,因为我真的很想了解你想做什么!
  • 您应该发布您的数据结构以及到目前为止您尝试过的内容。
  • 它们可能是外键值,因为两列是等效值。
  • 现在两个表中的PK只是ID(访问默认)。
  • 我最初运行的查询是为了合并两个表:SELECT table1.ID, TABLE1.BOM_PART_NAME, TABLE1.CII, TABLE1.[PART FIND NO], TABLE1.CSN, TABLE1.AFS, TABLE1。 EQP_POS_CD,TABLE1.LCN,TABLE1.POS_CT,TABLE1.SERIAL_NO,TABLE1.PART_NO_LLP,table2.[PART-ATA-NO],table2.[PW-PART-NO] FROM TABLE1 LEFT JOIN table2 ON TABLE1.[PART FIND NO] = table2.[PART-ATA-NO];

标签: sql ms-access join distinct-values


【解决方案1】:

打开访问并单击创建新查询 它将提示您选择要包含的表 选择它们后,如果它们之间还没有关系线,请拖放匹配的字段以创建关系 然后单击 Sigma 符号以打开分组选项 将要包含的字段向下拖动到为查询设置输出的区域 然后选择您要分组的字段以及哪些字段是您尝试获取其值的表达式 运行查询,看看你是否得到你想要的结果 如果不这样做,请摆弄选项,直到获得所需的输出 然后点击 Design/Run 按钮的下拉菜单,会有一个 SQL 选项 单击它,它将显示您要使用的选择语句

【讨论】:

    【解决方案2】:

    如果您想要 [PART FIND NO] 和 [PART-ATA-NO] 的唯一值,您可以尝试执行 UNION。

    SELECT Table1.[PART FIND NO]
    FROM Table1 UNION SELECT Table2.[PART-ATA-NO] As [PART FIND NO] From 
    Table2;
    

    有点奇怪,但是我在 Access 2016 中做了一个测试,值在 Table1 和 Table2 中重复,甚至值在 Table 中出现两次,并且 Union 只返回一次值。

    |Table1|
    |AAA|
    |BBB|
    |CCC|
    
    |Table2|
    |AAA|
    |BBB|
    |AAA|
    |DDD|
    
    |Query 1|
    |AAA|
    |BBB|
    |CCC|
    |DDD|
    

    希望对你有帮助

    【讨论】:

    • 这并不奇怪,但 UNION 只返回唯一行的设计。如果您希望 UNION 返回所有行,包括产生非唯一值的行,请使用 UNION ALL。
    【解决方案3】:

    我认为整个问题与How do I merge two tables in Access while removing duplicates?重复

    但这里有一个特定于您需要的查询。

    编辑:更新了第二个查询以删除 Table2。[PART-SN] 以在原始海报提供更多信息后消除合并表的重复项。

    SELECT Table1.*, Table2.[PART-ATA-NO], Table2.[PART-SN]
    FROM Table1 INNER JOIN Table2 ON Table1.[PART FIND NO] = Table2.[PART-ATA-NO]
    
    UNION
    
    SELECT Table1.*, Table2.[PART-ATA-NO]
    FROM Table1 LEFT JOIN Table2 ON Table1.[PART FIND NO] = Table2.[PART-ATA-NO]
    WHERE (((Table2.[PART-ATA-NO]) Is Null))
    
    UNION
    
    SELECT Table1.*, Table2.[PART-ATA-NO], Table2.[PART-SN]
    FROM Table1 RIGHT JOIN Table2 ON Table1.[PART FIND NO] = Table2.[PART-ATA-NO]
    WHERE (((Table1.[PART FIND NO]) Is Null));
    

    可能无法在一个查询中满足所有要求。一个查询的结果可以提供另一个查询。可以在另一个查询的 FROM 子句中使用保存的(即命名的)查询(或者如果在设计模式下,这意味着您可以像表一样显示和加入其他查询)。如果消除重复项是主要关注点,则保存修改后的 UNION 查询(​​如上),例如命名为 [Merge1and2]。

    假设 [Merge1And2] 现在只包含唯一的 [PART FIND NO],您可以执行类似的操作

    SELECT [Merge1And2].[PART FIND NO], Table2.[PART-SN]
    FROM [Merge1And2] INNER JOIN Table2 ON [Merge1And2].[PART FIND NO] = Table2.[PART-ATA-NO]
    

    这将为您提供每个唯一 [PART FIND NO] 的所有 [PART-SN] 值。当然,第二个查询的结果将不再显示唯一的 [PART FIND NO] 值,因为可能会为每个 [PART-SN] 列出相同的数字 - 至少根据您对 [PART-SN] 的评论表 2 中的每个 [PART-ATA-NO] 都有多个值。

    如果您的最终目标是合并这两个表,删除重复项,但是您有多个相关值,例如 [PART-SN],那么根据我所掌握的信息,您将需要多个表:首先要存储一个主表唯一的零件编号,然后是第二个表上的一对多关系,用于存储重复的 [PART-SN](可能还有其他)值。

    【讨论】:

    • 查询无效,但那是因为 PART-SN 也在重复。当我删除该字段时,PART FIND NO 和 PART-ATA-NO 的重复值将被删除。但是,我需要 PART-SN。我试图理解这个查询的逻辑。它如何确保两个字段的不同值,以及如何将此逻辑也应用于 PART-SN 字段?谢谢。
    • 我尝试了第三个 UNION,其中 table2 的 PART-SN 为 Null,在 table2 上有一个左连接,但这并没有改变结果。
    • 首先,您说的是“第三个”联合,但您描述了我给出的示例代码中列为“第二个”联合的内容。无论哪种方式,您所说的都告诉我一个表完全由 INNER JOIN 匹配,因此该表中没有不匹配的行。除非您发布显示相反信息的示例数据,否则我只能相信查询有效。您还可以单独运行每个 SELECT 语句进行调查。您还可以在 UNION 结果上运行各种 COUNT 查询,以查看所有计数加起来是否与原始表的计数相同......稍微仔细检查一下。
    • 样本数据:ID PART-FIND NO PART-ATA-NO PART-SN 1 001 001 101 2 002 002 110 3 003 003 120 3 003 003 130 4 004 004 120 4 004 004 130
    • 基本上,PART-SN 为每组匹配的 PART FIND NO 重复。当它移动到下一个 PART FIND NO 时,它是相同的 PART-SN。这不是正确的 PART-SN。
    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多