sql >> Databáze >  >> RDS >> Sqlserver

Najděte manažera v seznamu odděleném čárkami

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

Nebo předpokládám, že odpovídá vašemu skutečnému kódu:

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

Všimněte si, že váš návrh je extrémně chybný. Neexistuje žádný důvod, proč byste měli do této tabulky ukládat názvy, nehledě na seznam jakýchkoli datových bodů oddělených čárkami. Tyto skutečnosti jsou důležité samy o sobě, takže s nimi tak zacházejte!

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

Nyní k nastavení ukázkových dat, která jste zmínil:

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

Nyní k nalezení všech projektů, které Jim spravuje:

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;

Nebo můžete dokonce ručně trochu zkratovat:

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;

Nebo ještě více:

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

Kromě toho opravdu, opravdu, opravdu doufám v DISTINCT ve vašem původním dotazu je zbytečné. Opravdu máte více než jeden projekt se stejným názvem a ID?



  1. Ukládání databázových záznamů do pole

  2. Mazání souvisejících záznamů v MySQL

  3. Přidejte data ke stávajícím datům v databázi MySQL

  4. Jak SqlCacheDependency ví, kdy má komunikovat zpět se všemi posluchači, když se změní data v tabulce?