sql >> Database >  >> RDS >> Sqlserver

Zoek manager in een door komma's gescheiden lijst

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

Of ik veronderstel dat deze overeenkomt met uw werkelijke code:

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

Merk op dat uw ontwerp zeer gebrekkig is. Er is geen enkele reden waarom u namen in deze tabel zou moeten opslaan, laat staan ​​een door komma's gescheiden lijst van gegevenspunten. Deze feiten zijn op zichzelf al belangrijk, dus behandel ze ook zo!

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

Om nu de voorbeeldgegevens in te stellen die u noemde:

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

Om nu alle projecten te vinden die Jim beheert:

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;

Of je kunt zelfs handmatig een kortsluiting maken:

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;

Of zelfs meer:

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

Even terzijde, ik hoop echt, echt, echt dat de DISTINCT in uw oorspronkelijke zoekopdracht is niet nodig. Heb je echt meer dan één project met dezelfde naam en ID?



  1. Wat is de snelste manier om de dichtstbijzijnde geografische plaats uit de mysql-database te selecteren?

  2. Problemen bij het maken van Trigger in MySQL

  3. MySQL-draaitabelquery met dynamische kolommen die de sleutelwaarde afkappen

  4. Paginering van MySQL-resultaten in PHP