Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

मैं केवल टी-एसक्यूएल में आईडी की सीएसवी सूची में सभी मानों से मेल खाने वाली पंक्तियों को देने के लिए एक क्वेरी कैसे बना सकता हूं

नीचे दिए गए स्प्लिटर फ़ंक्शन का उपयोग करें जो एक इंट कॉलम देता है। इसलिए HAVING क्लॉज में गिनती की जांच करना आसान है।

CREATE FUNCTION [dbo].[DelimitedParamParser]( @DelimitedIds VARCHAR(MAX), @Delimiter CHAR(1)) 
RETURNS @IdsTable 
TABLE ( Id INT ) 
AS BEGIN

DECLARE @Length INT,
        @Index INT,
        @NextIndex INT

SET @Length = DATALENGTH(@DelimitedIds)
SET @Index = 0
SET @NextIndex = 0


WHILE (@Length > @Index )
BEGIN
    SET @NextIndex = CHARINDEX(@Delimiter, @DelimitedIds, @Index)
    IF (@NextIndex = 0 ) SET @NextIndex = @Length + 2
        INSERT @IdsTable SELECT SUBSTRING( @DelimitedIds, @Index, @NextIndex - @Index )
    SET @index = @nextindex + 1
END
 RETURN
END

यह काम करता है, अंत में एक अतिरिक्त अल्पविराम देने का ध्यान रखें।

DECLARE @DELIMITER CHAR = ','
DECLARE @CSV_STRING VARCHAR(20) = '1,3,'

SELECT Distinct SUPER_HERO.NAME, SKILL.NAME
FROM 
    SUPER_HERO
    INNER JOIN SUPER_HERO_SKILL ON  SUPER_HERO_SKILL.SUPER_HERO_ID = SUPER_HERO.ID
    INNER JOIN SKILL ON SUPER_HERO_SKILL.SKILL_ID = SKILL.ID
    WHERE SUPER_HERO.ID IN
    (
    SELECT SUPER_HERO_SKILL.SUPER_HERO_ID   
    FROM 
        SUPER_HERO
        INNER JOIN SUPER_HERO_SKILL ON  SUPER_HERO_SKILL.SUPER_HERO_ID = SUPER_HERO.ID
        INNER JOIN SKILL ON SUPER_HERO_SKILL.SKILL_ID = SKILL.ID
        INNER JOIN DelimitedParamParser(@CSV_STRING, @DELIMITER) SPLIT  ON SPLIT.ID = SUPER_HERO_SKILL.SKILL_ID
    GROUP BY SUPER_HERO_SKILL.SUPER_HERO_ID
    HAVING COUNT(DISTINCT(SUPER_HERO_SKILL.SKILL_ID)) = (SELECT COUNT(DISTINCT(Id)) FROM DelimitedParamParser(@CSV_STRING, @DELIMITER))
    )


  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 सर्वर RAISERROR क्या है?

  2. सिक्योर द्वारा SQL इंजेक्शन अटैक को कैसे रोकें

  3. वेब-ऐप में रिपोर्टिंग सर्विसेज 2005 द्वारा कॉल किए जाने पर दूसरी टी-एसक्यूएल क्वेरी पहले की तुलना में बहुत तेज क्यों चलती है

  4. पंक्तियों की समान संख्या के साथ दो तालिकाओं को उनके क्रम से कैसे जोड़ा जाए

  5. SQL सर्वर में विभिन्न फ़ील्ड से अधिकतम मान प्राप्त करें और संबंधित मान दिखाएं