SQL Сервер - Как применить значение поля из комбинации полей, не повторяемых с другим значением поля - PullRequest
0 голосов
/ 03 февраля 2020

Я знаю, что не очень хорошо сформулировал вопрос, честно говоря, мне было трудно объяснить без примера.

У меня есть таблица с полями SalesPersonID и SalesPersonSSN.

enter image description here

Мое требование - SalesPersonID должен существовать только с одним SalesPersonSSN и наоборот.

Если вы видите таблицу (пример данных), запись с SalesPersonID 2003 недопустим, потому что SalesPersonSSN 3344556677 уже существует с SalesPersonID 2001. Аналогично SalesPersonID 2001 никогда не должно существовать с другим, кроме 3344556677. Я не знаю, как применить это правило в таблице. Также есть простой запрос, чтобы узнать, нарушено ли правило.

Ответы [ 3 ]

1 голос
/ 03 февраля 2020

Чтобы узнать, нарушено ли ваше правило, вы можете воспользоваться следующей

Таблица

DECLARE @t TABLE (SalesPersonId INT, SalesPersonSSN VARCHAR(255))
INSERT INTO @t VALUES (2001,'3344556677'), (2002,'7755330099'), (2003,'3344556677')

Запрос

SELECT  t.*
FROM    @t t
INNER JOIN (SELECT  SalesPersonSSN
            FROM    @t
            GROUP BY SalesPersonSSN
            HAVING COUNT(*) > 1
         ) a
 ON a.SalesPersonSSN = t.SalesPersonSSN
1 голос
/ 03 февраля 2020

Вы хотите unique ограничение:

alter table t
    add constraint ssn unique(SalesPersonSSN);

Если вы хотите, чтобы данные, которые нарушают правила, вы можете использовать exists:

select t.*
from table t
where exists (select 1 
              from table t1 
              where t1.SalesPersonSSN = t.SalesPersonSSN and 
                    t1.SalesPersonID <> t.SalesPersonID
             );
0 голосов
/ 03 февраля 2020

Вам необходимо написать полный лог c для него:

declare @ssn as varchar(255)='7755330099' --INPUT
declare @pid as int=201 --INPUT

declare @ssn1 as varchar(255)--local variable
declare @pid1 as int --local variable

select @pid1=SalesPersonId from #t where SalesPersonSSN=@ssn;
select @ssn1=SalesPersonSSN from #t where SalesPersonId=@pid;
if(@pid1 is not null and @pid1<>@pid)
begin
print('failed: as person '+cast(@pid1 as varchar(255))+' already asigned to ssn#'+@ssn)
end
if(@ssn1 is not null and @ssn1<>@ssn)
begin
print('failed: as ssn#'+@ssn1 +' already asigned to pid# '+cast(@pid as varchar(255)))
end

Определение таблицы:

create TABLE #t(SalesPersonId INT, SalesPersonSSN VARCHAR(255))
INSERT INTO #t VALUES (2001,'3344556677'), (2002,'7755330099'), (2003,'3344556677')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...