Parce que vous ne l'avez pas vous posté schéma que SQL DDL, je vais avoir des problèmes pour voir comment ces tables peuvent travailler entraine toi. Voici ma tentative:
Il semblerait raisonnable d'envisager qu'un employé doit être une personne, si c'est assez facile (deviner les types de données et les règles de domaine):
CREATE TABLE NaturalPersons
(
PersonId INTEGER NOT NULL UNIQUE
);
CREATE TABLE Employees
(
PersonId INTEGER NOT NULL UNIQUE
REFERENCES NaturalPersons (PersonId),
EmployeeID CHAR(3) NOT NULL UNIQUE
CHECK (EmployeeID LIKE '[A-Z][0-9][0-9]')
);
Le nom de la table « persondata » n » t révèlent beaucoup, mais des noms d'éléments de données, il semble que quelque chose est transféré d'une personne/employé à un autre:
CREATE TABLE Transfers
(
FromPersonId INTEGER
REFERENCES NaturalPersons (PersonId),
FromEmployeeID CHAR(3)
REFERENCES Employees (EmployeeID),
ToPersonId INTEGER
REFERENCES NaturalPersons (PersonId),
ToEmployeeID CHAR(3)
REFERENCES Employees (EmployeeID)
);
Hmm, toutes NULL
colonnes capables signifie que nous ne pouvons pas avoir un PRIMARY KEY
mais je me demande s'il y a une clé du tout ...?
Nous ne voulons un type d'ID pour « de » et « à » respectivement:
ALTER TABLE Transfers ADD
CONSTRAINT only_one_from_ID
CHECK (
(FromPersonId IS NULL AND FromEmployeeID IS NOT NULL)
OR
(FromPersonId IS NOT NULL AND FromEmployeeID IS NULL)
);
ALTER TABLE Transfers ADD
CONSTRAINT only_one_to_ID
CHECK (
(ToPersonId IS NULL AND ToEmployeeID IS NOT NULL)
OR
(ToPersonId IS NOT NULL AND ToEmployeeID IS NULL)
);
Nous voulons aussi que une des règles d'affaires « de bon sens » pour empêcher les transferts de et vers la même personne/employé :
ALTER TABLE Transfers ADD
CONSTRAINT FromPersonId_cannot_be_ToPersonId
CHECK (FromPersonId <> ToPersonId);
ALTER TABLE Transfers ADD
CONSTRAINT FromEmployeeId_cannot_be_ToEmployeeId
CHECK (FromEmployeeId <> ToEmployeeId);
C'est à peu près le mieux que nous pouvons faire, mais nous avons quelques problèmes:
INSERT INTO NaturalPersons (PersonId) VALUES (1), (2), (3), (4);
INSERT INTO Employees (PersonId, EmployeeID) VALUES (1, 'A11'), (2, 'B22');
-- transfer to same entity - oops!:
INSERT INTO Transfers (FromPersonId, ToEmployeeID) VALUES (1, 'A11');
-- Duplicate transfer - oops!:
INSERT INTO Transfers (FromEmployeeId, ToPersonID) VALUES (1, 'B1'); -- duplicate
INSERT INTO Transfers (FromPersonId, ToEmployeeID) VALUES ('A1', 2); -- duplicate
En d'autres termes, le fait de mélanger PersonId et EmployeeID dans la même table rend difficile l'écriture de règles de données de base.
Si j'ai raison de supposer qu'un employé est une personne, pourquoi ne pas utiliser uniquement PersonID?
Si un employé n'est pas une personne, pouvez-vous poster votre schéma (type de données, contraintes, etc.)?
Si vous êtes intéressé à faire les choses "correctement" - votre structure de table sent le genre (ou je ne comprends pas ce que vous faites). Cela semble être une simple table d'association à deux colonnes, avec PersonID et EmployeeID. Quel est le point des colonnes nulles? – harpo
@Harpo c'est une ancienne application pour laquelle je migre les données et cela a été fait il y a 10-15 ans ... – VoodooChild
Pourquoi obtenir plus de résultats que dans PersonData un résultat incorrect? Si vous avez des valeurs pour FromPersonID et ToPersonID, votre jointure va correspondre à 2 enregistrements dans la table Person –