SQL: скажите, являются ли столбцы уникальными по отношению друг к другу - PullRequest
0 голосов
/ 02 января 2009

Предположим, у меня есть стол:

Role
----
person_id company_id financial_year

Как мне сказать следующее:

  1. указывается, встречается ли каждый person_id не более одного раза для company_id на финансовый_год в этой таблице
  2. Если 1. ложно, то, какие person_id, company_id и financial_year встречаются более одного раза

Редактировать 1: отредактировано, чтобы добавить финансовую год col

Редактировать 2: платформой СУБД в данном случае является MySQL, хотя я не ожидаю, что для этого потребуется много специфичного для поставщика SQL

Ответы [ 4 ]

4 голосов
/ 02 января 2009

Во-первых, обычно неплохо иметь группировку, которую можно затем отфильтровать, если вы хотите:

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 голосов
/ 02 января 2009

Да, в общем, для обнаружения дубликатов,

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
0 голосов
/ 02 января 2009

Я думаю, что это будет сделано для # 1:

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

(Изменить: если два count () разные, то таблица содержит несколько строк на уникальную комбинацию из трех столбцов, о чем я спрашивал в вопросе № 1. Возьмите разницу из них, чтобы получить число такие строки.)

и ответ casperOne сделает это за # 2

0 голосов
/ 02 января 2009

Это должно сделать то, что вам нужно:

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. Это будет возвращать одну строку для повторяющейся комбинации человек / компания / год со счетчиком количества повторений этой комбинации (хотя это количество не упоминалось в вопросе, я знаю, что иногда оно может быть полезным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...