Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Temukan pengelola dalam daftar yang dipisahkan koma

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

Atau saya kira cocok dengan kode Anda yang sebenarnya:

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

Perhatikan bahwa desain Anda sangat cacat. Tidak ada alasan Anda harus menyimpan nama dalam tabel ini sama sekali, apalagi daftar titik data yang dipisahkan koma. Fakta-fakta ini sendiri penting, jadi perlakukan mereka seperti itu!

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

Sekarang untuk menyiapkan data sampel yang Anda sebutkan:

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

Sekarang untuk menemukan semua proyek yang dikelola Jim:

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;

Atau Anda bahkan dapat melakukan korsleting secara manual:

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;

Atau bahkan lebih:

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

Selain itu, saya sangat, sangat, sangat berharap DISTINCT dalam kueri asli Anda tidak diperlukan. Apakah Anda benar-benar memiliki lebih dari satu proyek dengan nama yang sama dan 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. Tidak Dapat Mengkompilasi Komponen SSIS; Majelis Hilang di Visual Studio 2008

  2. Setel ulang kunci utama (int sebagai identitas)

  3. Mengapa kita selalu lebih suka menggunakan parameter dalam pernyataan SQL?

  4. cara menulis fungsi angka ke kata di sql server

  5. Kesalahan Umum DBA di MS SQL Server