sql >> Database teknologi >  >> RDS >> Sqlserver

Find manager i en kommasepareret liste

WHERE ',' + Manager + ',' LIKE '%,Jim,%'

Eller jeg formoder at matche din faktiske kode:

WHERE ',' + Manager + ',' LIKE '%,' + @Manager + ',%'

Bemærk, at dit design er ekstremt mangelfuldt. Der er ingen grund til, at du overhovedet skal gemme navne i denne tabel, pyt med en kommasepareret liste over datapunkter. Disse fakta er vigtige i sig selv, så behandl dem på den måde!

CREATE TABLE dbo.Managers
(
  ManagerID INT PRIMARY KEY,
  Name NVARCHAR(64) NOT NULL UNIQUE, ...
);

CREATE TABLE dbo.Projects
(
  ProjectID INT PRIMARY KEY,
  Name NVARCHAR(64) NOT NULL UNIQUE, ...
);

CREATE TABLE dbo.ProjectManagers
(
  ProjectID INT NOT NULL FOREIGN KEY REFERENCES dbo.Projects(ProjectID),
  ManagerID INT NOT NULL FOREIGN KEY REFERENCES dbo.Managers(ManagerID)
);

Nu for at opsætte de eksempeldata, du nævnte:

INSERT dbo.Managers(ManagerID, Name)
  VALUES(1,N'John'),(2,N'Jim'),(3,N'Julie');

INSERT dbo.Projects(ProjectID, Name)
  VALUES(1,N'Project 1'),(2,N'Project 2');

INSERT dbo.ProjectManagers(ProjectID,ManagerID)
  VALUES(1,1),(1,2),(2,2),(2,3);

Nu for at finde alle de projekter, Jim administrerer:

DECLARE @Manager NVARCHAR(32) = N'Jim';

SELECT p.ProjectID, p.Name
  FROM dbo.Projects AS p
  INNER JOIN dbo.ProjectManagers AS pm
  ON p.ProjectID = pm.ProjectID
  INNER JOIN dbo.Managers AS m
  ON pm.ManagerID = m.ManagerID
  WHERE m.name = @Manager;

Eller du kan endda manuelt kortslutte lidt:

DECLARE @Manager NVARCHAR(32) = N'Jim';


DECLARE @ManagerID INT;
SELECT @ManagerID = ManagerID
  FROM dbo.Managers
  WHERE Name = @Manager;

SELECT p.ProjectID, p.Name
  FROM dbo.Projects AS p
  INNER JOIN dbo.ProjectManagers AS pm
  ON p.ProjectID = pm.ProjectID
  WHERE pm.ManagerID = @ManagerID;

Eller endnu mere:

DECLARE @Manager NVARCHAR(32) = N'Jim';


DECLARE @ManagerID INT;
SELECT @ManagerID = ManagerID
  FROM dbo.Managers
  WHERE Name = @Manager;

SELECT ProjectID, Name
  FROM dbo.Projects AS p
  WHERE EXISTS 
  (
    SELECT 1 
      FROM dbo.ProjectManagers AS pm
      WHERE pm.ProjectID = p.ProjectID
      AND pm.ManagerID = @ManagerID
  );

Til gengæld håber jeg virkelig, virkelig, virkelig DISTINCT i din oprindelige forespørgsel er unødvendig. Har du virkelig mere end et projekt med samme navn og ID?



  1. Oracle Trigger Indsæt/opdatering

  2. MySQL kombinerer vælg med sum fra anden tabel

  3. Adgang nægtet for brugeren 'root'@'localhost' (ved hjælp af adgangskode:Ja) efter nulstilling af adgangskode LINUX

  4. beregne og vise en dato som 'sekunder siden', 'mins siden', 'timer siden' osv.