Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tìm người quản lý trong danh sách được phân tách bằng dấu phẩy

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

Hoặc tôi cho là khớp với mã thực của bạn:

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

Lưu ý rằng thiết kế của bạn rất thiếu sót. Không có lý do gì bạn phải lưu trữ tên trong bảng này cả, đừng bận tâm đến một danh sách được phân tách bằng dấu phẩy của bất kỳ điểm dữ liệu nào. Những sự thật này tự nó quan trọng, vì vậy hãy đối xử với chúng theo cách đó!

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

Bây giờ để thiết lập dữ liệu mẫu mà bạn đã đề cập:

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

Bây giờ để tìm tất cả các dự án Jim đang quản lý:

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;

Hoặc bạn thậm chí có thể đoản mạch theo cách thủ công một chút:

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;

Hoặc thậm chí nhiều hơn:

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

Ngoài ra, tôi thực sự rất hy vọng DISTINCT trong truy vấn ban đầu của bạn là không cần thiết. Bạn có thực sự có nhiều dự án có cùng tên không 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. SQL Server v.Next:Hiệu suất STRING_AGG ()

  2. Khắc phục “Ít nhất một trong các đối số đối với COALESCE phải là một biểu thức không phải là hằng số NULL” trong SQL Server

  3. Kỹ thuật đảo ngược để lập sơ đồ cơ sở dữ liệu trong Visio với SQL Server 2008

  4. T-Sql dường như đang đánh giá câu lệnh If ngay cả khi điều kiện không đúng

  5. Cách thực hiện truy vấn với group_concat trong máy chủ sql