【问题标题】:SQL Unique ValuesSQL 唯一值
【发布时间】:2011-12-17 14:49:27
【问题描述】:

我有这个连接 3 个表的查询。它似乎正在工作,但我得到了重复。如何删除重复项?

SELECT FIRST 100 e.email_id, e.location_id, e.email, l.location_type, p.salutation,
       p.fname, p.lname
FROM email e, location l, person p
WHERE e.location_id = l.location_id
AND l.per_id = p.per_id

【问题讨论】:

  • 您使用的是哪个版本的 Informix?您应该能够使用 SQL-92 显式连接表示法而不是您正在使用的隐式连接 - 除非您有一个非常旧的 Informix 版本(OnLine 5.20、SE 7.2x)。您还应该使用显式连接而不是 Informix 样式的 OUTER 连接 - 我在您现在已删除的问题中看到了这一点。

标签: sql join informix duplicate-data


【解决方案1】:

简单的答案是将 DISTINCT 添加到您的查询中。

SELECT FIRST 100 DISTINCT e.email_id, e.location_id, e.email, l.location_type, p.salutation, p.fname, p.lname
FROM email e, location l, person p
WHERE e.location_id = l.location_id
AND l.per_id = p.per_id

【讨论】:

  • 添加 DISTINCT 只会让它永远运行,即使我执行 SELECT FIRST 2
  • 这是因为引擎必须扫描所有行以执行重复数据删除,然后再将任何行返回给客户端。在这种情况下,FIRST N 子句的作用不大。
【解决方案2】:

使用不同

  SELECT FIRST 100 Distinct e.email_id, e.location_id, 
         e.email, l.location_type, p.salutation, 
         p.fname, p.lname 
  FROM email e, location l, person p 
  WHERE e.location_id = l.location_id AND l.per_id = p.per_id 

【讨论】:

    【解决方案3】:

    由于您正在执行直接内部连接,因此如果输入表中有重复条目,则只会在结果集中获得重复条目。

    SELECT FIRST 100 e.email_id, e.location_id, e.email, l.location_type, p.salutation,
           p.fname, p.lname
      FROM email AS e
      JOIN location AS l ON e.location_id = l.location_id
      JOIN person AS p ON l.per_id = p.per_id
    

    最有可能出现问题的地方是“位置”表。您可以通过以下查询来确定这一点:

    SELECT location_id, per_id, COUNT(*)
      FROM location
     GROUP BY location_id, per_id
    HAVING COUNT(*) > 1;
    

    如果这返回了任何数据,那么你就有了一个指向问题所在的指针。然后,您应该检查为什么您对 location_id、per_id 的组合没有唯一约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多