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 . की आशा करता हूं आपकी मूल क्वेरी में अनावश्यक है। क्या आपके पास वास्तव में एक ही नाम के एक से अधिक प्रोजेक्ट हैं और आईडी?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टेबल वैल्यूड फंक्शन मेरी क्वेरी के प्रदर्शन को खत्म कर रहा है

  2. Linux से Microsoft SQL सर्वर तक पहुँचने के कुछ तरीके क्या हैं?

  3. SQL सर्वर BCP निर्यात जहाँ SQL फ़ील्ड में अल्पविराम है

  4. SQL सर्वर में डुप्लिकेट पंक्तियों की जाँच करने के 4 तरीके

  5. MSSQL:अपलोड की गई फ़ाइल से मेल खाने वाली पंक्तियों को अपडेट करें