Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Намерете мениджър в списък, разделен със запетаи

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

Или предполагам, че съответства на действителния ви код:

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

Обърнете внимание, че вашият дизайн е изключително грешен. Няма причина изобщо да съхранявате имена в тази таблица, без значение разделен със запетаи списък с точки от данни. Тези факти са важни сами по себе си, така че се отнасяйте към тях по този начин!

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

Сега, за да настроите примерните данни, които споменахте:

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

Сега, за да намерите всички проекти, които Джим управлява:

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;

Или можете дори ръчно да късо съединение:

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;

Или дори повече:

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

Като настрана, наистина, наистина, наистина се надявам DISTINCT в оригиналната ви заявка е ненужен. Наистина ли имате повече от един проект с едно и също име и ID?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Знаци, които трябва да бъдат екранирани в T-SQL

  2. Различни начини за сравняване на схема и данни на таблици на SQL Server

  3. datetime2 срещу datetimeoffset в SQL Server:Каква е разликата?

  4. Преобразувайте „smalldatetime“ в „time“ в SQL Server (T-SQL примери)

  5. Как да изпълня MSSQL съхранена процедура с ADOdb PHP библиотека?