Sql 获取两个字段值的唯一组合

Sql 获取两个字段值的唯一组合,sql,ms-access,Sql,Ms Access,可能以前有人问过,但我找不到答案 表数据有两列: Source Dest 1 2 1 2 2 1 3 1 我正在尝试提出一个MS Access 2003 SQL查询,该查询将返回: 1 2 3 1 但一切都无济于事。请帮忙 更新:没错,我正试图排除2,1,因为1,2已经包括在内。我只需要顺序不重要的唯一组合。使用此查询: SELECT distinct * from tabval ; 要消除重复,

可能以前有人问过,但我找不到答案

表数据有两列:

Source   Dest
1         2
1         2
2         1
3         1
我正在尝试提出一个MS Access 2003 SQL查询,该查询将返回:

1       2
3       1
但一切都无济于事。请帮忙

更新:没错,我正试图排除2,1,因为1,2已经包括在内。我只需要顺序不重要的唯一组合。

使用此查询:

SELECT distinct *  from tabval ;
要消除重复,“选择不同”比“分组依据”更容易:

编辑:我现在看到您正在尝试获得唯一的组合(不要同时包含1,2和2,1)。你可以这样做:

select distinct source,dest from data
minus
select dest,source from data where source < dest
从数据中选择不同的源、目的地
减
选择dest,source from data,其中source

“减号”翻转顺序,消除已经匹配的情况;“where source您的问题被问错了。“独特组合”是您所有的记录。但我想你的意思是每个来源一行。因此:

SELECT *
FROM   tab t1
WHERE  t1.Dest IN 
(
   SELECT TOP 1 DISTINCT t2.Dest
   FROM tab t2
   WHERE t1.Source = t2.Source
)

对于Ms Access,您可以尝试

SELECT  DISTINCT
        *
FROM Table1 tM
WHERE NOT EXISTS(SELECT 1 FROM Table1 t WHERE tM.Source = t.Dest AND tM.Dest = t.Source AND tm.Source > t.Source)
编辑:

示例与表数据相同

SELECT  DISTINCT
        *
FROM Data  tM
WHERE NOT EXISTS(SELECT 1 FROM Data t WHERE tM.Source = t.Dest AND tM.Dest = t.Source AND tm.Source > t.Source)
或者(尼斯和Access格式…)

会回来的

1, 2
1, 3

在MySQL中。

2-1也是唯一的,是否应该将其排除在外?为什么2,1会被排除在外?是因为包含了1,2吗?然后你如何决定使用1,2还是2,1?2,1应该被排除,这就是问题所在,1,2还是2,1被包含并不重要,只要它只是行中的一行。将返回1,2;2,1; 3.1-2,1应该被排除在外您不能在MS Access中使用减号,因此会出现以下问题:)第一次修订返回1,2;1,2; 3,1这显然是不正确的。我只是在MS Access上运行它,它返回1,2 3,1。你测试过这个吗?您是否包含了DISTINCT?Astander,一对一地复制了它,刚刚将表1替换为DataAstander mine is Access 2003,SP3请检查您的查询属性是否将Unique Value设置为Yes。在MS Access 2003中不起作用,抱怨in子句。顺便说一句,以防问题中存在所需输出的示例,以消除可能的歧义。此查询将返回所需的行,但我不知道如何在ms access sql中写入。Andrey,抱歉,我在问题中澄清了它必须是access 2003。
SELECT DISTINCT *
FROM Data AS tM
WHERE (((Exists (SELECT 1 FROM Data t WHERE tM.Source = t.Dest AND tM.Dest = t.Source AND tm.Source > t.Source))=False));
SELECT t1.* FROM
(SELECT
  LEAST(Source, Dest) AS min_val,
  GREATEST(Source, Dest) AS max_val
FROM table_name) AS t1
GROUP BY t1.min_val, t1.max_val
1, 2
1, 3