【问题标题】:Fetch unique combinations of two field values获取两个字段值的唯一组合
【发布时间】:2010-03-05 12:27:17
【问题描述】:

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

表格数据有两列:

Source   Dest
1         2
1         2
2         1
3         1

我试图提出一个将返回的 MS Access 2003 SQL 查询:

1       2
3       1

但一切都无济于事。请帮忙!

更新:确切地说,我正在尝试排除 2,1,因为 1,2 已经包含在内。我只需要顺序无关紧要的独特组合。

【问题讨论】:

  • 2 - 1 也是唯一的,应该排除吗?
  • 为什么会忽略 2,1?是因为包含 1,2 吗?那么你如何决定使用 1,2 还是 2,1?
  • 2,1 应该排除,这就是问题
  • 旁观者,1,2 或 2,1 是否包含在内都无关紧要,只要它只是其中一行即可。

标签: sql ms-access


【解决方案1】:

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)

编辑:

以表Data为例,也是一样的...

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)

或(Nice and Access Formatted...

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));

【讨论】:

  • 第一个版本返回 1,2; 1,2; 3,1 这显然是不正确的。
  • 我只是在 MS Access 上运行它,它返回 1,2 3,1。你测试过这个吗?您是否包含了 DISTINCT
  • Astander,一对一复制,只是把Table1换成了Data
  • Astander 我的是 Access 2003, SP3
  • 请检查您的查询属性,确认 Unique Values 设置为 Yes
【解决方案2】:

使用这个查询:

SELECT distinct *  from tabval ;

【讨论】:

    【解决方案3】:

    您的问题被错误地提出。 “独特的组合”是您的所有记录。但我认为您的意思是每个来源一行。原来如此:

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

    【讨论】:

    • 在 MS Access 2003 中不起作用,抱怨 IN 子句。顺便说一句,以防万一问题中有所需输出的样本,以消除可能的歧义。
    • 此查询将返回所需的行,但我不知道如何在 ms access sql 中写入。
    • 安德烈,抱歉,我在问题中澄清说它必须是 Access 2003。
    【解决方案4】:
    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
    

    在 MySQL 中。

    【讨论】:

      【解决方案5】:

      为了消除重复,“select distinct”比“group by”更容易:

      select distinct source,dest from data;
      

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

      select distinct source,dest from data
      minus
      select dest,source from data where source < dest
      

      “减号”会颠倒顺序并消除已经匹配的情况; “where source

      【讨论】:

      • 将返回 1,2 ; 2,1; 3;1 - 应排除 2,1
      • 您不能在 MS Access 中使用减号,因此会出现问题 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      相关资源
      最近更新 更多