Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Finden Sie den Manager in einer durch Kommas getrennten Liste

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

Oder ich nehme an, um mit Ihrem tatsächlichen Code übereinzustimmen:

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

Beachten Sie, dass Ihr Design extrem fehlerhaft ist. Es gibt keinen Grund, warum Sie überhaupt Namen in dieser Tabelle speichern sollten, ganz zu schweigen von einer durch Kommas getrennten Liste von Datenpunkten. Diese Fakten sind an sich schon wichtig, also behandeln Sie sie auch so!

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)
);

Richten Sie nun die von Ihnen erwähnten Beispieldaten ein:

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);

Um nun alle Projekte zu finden, die Jim verwaltet:

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;

Oder Sie können sogar manuell etwas kurzschließen:

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;

Oder noch mehr:

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
  );

Abgesehen davon hoffe ich wirklich, wirklich, wirklich, dass DISTINCT in Ihrer ursprünglichen Abfrage ist unnötig. Haben Sie wirklich mehr als ein Projekt mit demselben Namen und ID?