0

如果有人可以在这里指出一个预先存在的问题,那就太好了。原来我很难找到这个案例。

查看SQL 小提琴进行修改。为了 SO 搜索能力,这里是模式和小提琴中的问题:

在我的用户表中,我对分配给用户的国家/地区有一个唯一约束(每个国家/地区不超过一个用户)。然而,他们可以住在他们选择的任何地方。

开始问题

我只想返回分配的国家和住所在记录中只出现一次的用户,在这种情况下是记录 4,其中列之间的重复也是不希望的,并且行之间没有重复。如何?!:)

CREATE TABLE users
    (`id` int, 
     `country` varchar(255), 
     `domicile` varchar(255), UNIQUE(country)
    )
;

INSERT INTO users
    (`id`, `country`, `domicile`)
VALUES
    # Duplicate across column and row
    (1, "usa", "usa"),
    (2, "canada", "usa"),

    # Duplicate only across columns or no duplication
    (3, "mexico", "mexico"),
    (4, "uganda", "australia"),    

    # Duplicate only across rows
    (5, "germany", "portugal"),
    (6, "france", "portugal"),
    (7, "spain", "portugal")
;

暂时搁置适当的设计会使这更容易。我只是想用已经处理的手工作。;)

4

2 回答 2

2

我认为这是最简单的方法:

SELECT *
FROM users
GROUP BY domicile
HAVING COUNT(*) = 1

小提琴

与 Eugen 的答案不同,这确实取决于该country列具有唯一约束这一事实,因此它只需要检查domicile.

于 2013-10-24T00:02:42.957 回答
1

如果我理解正确,您想在国家和住所之间进行重复数据删除 - 所以我们需要两个步骤:

SELECT
  MIN(id),
  country,
  domicile,
  COUNT(*) AS domnum
FROM (
  SELECT
    MIN(id) AS id,
    country,
    domicile,
    COUNT(*) AS counum
  FROM users
  GROUP BY country
  HAVING counum=1
) AS base
GROUP BY domicile
HAVING domnum=1

编辑

使用您的测试数据,跨住所的重复数据删除就足够了,但无论如何我都包括了这两个步骤。

编辑

SQLfiddle

于 2013-10-23T23:52:39.183 回答