从具有其他非不同列的两个表的两个不同列中选择不同的值

时间:2017-06-09 20:59:46

标签: sql ms-access join distinct-values

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

我想要的唯一值的字段是table2中的[PART-SN]。我想从表2中选择table1和[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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果您想要[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中重复了值,甚至在表中出现两次值,而Union只返回一次值。

|Table1|
|AAA|
|BBB|
|CCC|

|Table2|
|AAA|
|BBB|
|AAA|
|DDD|

|Query 1|
|AAA|
|BBB|
|CCC|
|DDD|

希望有所帮助

答案 2 :(得分:0)

我认为整体问题与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](以及可能的其他)值。