2009-01-02 33 views
0

假设我有一个表:SQL:告诉列是唯一相对于彼此

Role 
---- 
person_id company_id financial_year 

我怎么可以跟以下:

  1. 无论各为person_id最多出现一次每本表中每financial_year COMPANY_ID
  2. 1.如果是假的,这为person_id的和的company_id的和financial_year的共同出现不止一次

编辑1:编辑补充financial_year山坳

编辑2:这里的RDBMS平台恰好是MySQL的,但我不认为这将需要大量的供应商特定的SQL

回答

4

对于第一种,它通常是一个好主意,只是有一个分组其中,如果你愿意,你就可以过滤的:

select 
    r.company_id, r.person_id, r.financial_year, count(r.person_id) 
from 
    Role as r 
group by 
    r.company_id, r.person_id, r.financial_year 

对于第二个,你可以修改上面,像这样:

select 
    r.company_id, r.person_id, r.financial_year, count(r.person_id) 
from 
    Role as r 
group by 
    r.company_id, r.person_id, r.financial_year 
having 
    count(r.person_id) > 1 
+0

有条款应该在群组之后。 – jackrabbit 2009-01-02 18:42:14

0

这应该做你需要:

select left.person_id, left.company_id, left.financial_year, count(*) 
from role left 
inner join role right 
    on left.person_id = right.person_id 
     and left.company_id = right.company_id 
     and left.financial_year = right.financial_year 
group by left.person_id, left.company_id, left.financial_year 

注意,这是T-SQL(MS),但我知道这可能会改变的唯一事情是表的别名语法,剩下的就是ANSI SQL。这将返回一行/重复人/公司/年组合,并重复组合的次数(尽管计数未在问题中提及,我知道它有时可能有用)。

+0

由于写了,不理清财务年度。它还会返回角色中的每个条目,因为该行可以与其自身连接。 – 2009-01-02 19:35:04

+0

我看到这个问题被编辑添加财政年度 - 也许你在那之前回答... – 2009-01-02 19:35:48

+0

我做到了 - 我会加入! – 2009-01-02 19:38:39

0

我认为这将做它#1:

select count(*), count(distinct person_id, company_id, financial_year) 
    from role 

(编辑:如果两个计数()的不同,则该表包含三列的每个唯一组合的多行,我在问#1中提出的问题。把他们的差别得到这样的行数。)

和casperOne的回答会做#2

0

是的,在一般情况下,检测是否有重复,

Select [ColumnList you want to be unique] 
From Table 
Group By [SameColumn List] 
Having Count(*) > 1 

在您的具体情况

Select person_id, company_id, financial_year 
From Table 
Group By person_id, company_id, financial_year 
Having Count(*) > 1 

,或者为你的子问题(1)是否每个为person_id每COMPANY_ID每financial_year在此表中最多出现一次

Select company_id, financial_year 
From Table 
Group By company_id, financial_year 
Having Count(Person_Id) > 1 

和(2):(当(1)是假的,这为person_id的和的company_id的和financial_year的共同出现一次

Select person_id, company_id, financial_year 
From Table T 
Where Not Exists 
    (Select * From Table 
     Where company_id = T.company_id 
     And financial_year = T.financial_year   
     Having Count(Person_Id) > 1) 
Group By person_id, company_id, financial_year 
Having Count(*) > 1