Comment sélectionner datatables où id d'un ID de string?

J'ai deux tables, TABLE1 avec deux colonnes (EID et NAME), TABLE2 avec deux colonnes (CID et E_LIST). Maintenant, je veux sélectionner datatables de TABLE1 avec EID de E_LIST de TABLE2, mais semble que cela ne fonctionne pas.

EID NAME E01 GREEN E02 BROWN E03 BLACK E04 APPLE E05 FOOD E06 FISH CID E_LIST C01 E02,E05,E06 C02 E01,E02,E03 SELECT * FROM TABLE1 WHERE EID IN (SELECT E_LIST FROM TABLE2 WHERE CID ='C01') 

Pouvez-vous me dire quelle est l'erreur ici et me donner une solution à ce sujet. Je vous remercie.

Utilisez une fonction de séparation de strings comme dans le lien. Il y a d'autres meilleures fonctions.

 SELECT * FROM TABLE1 WHERE EID IN (SELECT Item FROM dbo.SplitSsortingng(SELECT TOP 1 E_LIST FROM TABLE2 WHERE CID ='C01')) 

Arrêtez de stocker des valeurs séparées par des virgules dans une seule colonne. Avoir des lignes individuelles pour chaque combinaison CID et E_LIST . La récupération de données sera beaucoup plus facile

Maintenant, revenons à la question, vous avez besoin d'une fonction de string séparée pour le faire

 SELECT * FROM TABLE1 WHERE EID IN (SELECT cs.split_items FROM TABLE2 t2 CROSS apply Udf_splitssortingng(t2.E_LIST, ',') cs WHERE t2.CID = 'C01') 

Créez-en un à partir de là. Diviser les cordes de la bonne manière – ou la meilleure façon suivante .

Je préfère la méthode de la table de pointage

 CREATE FUNCTION dbo.Udf_splitssortingng ( @List NVARCHAR(MAX), @Delimiter NVARCHAR(255) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN WITH cteTally(N) AS ( SELECT TOP (DATALENGTH(ISNULL(@List,1))+1) Number-1 FROM dbo.Numbers ORDER BY Number ), cteStart(N1) AS ( SELECT t.N+1 FROM cteTally t WHERE (SUBSTRING(@List,tN,1) = @Delimiter OR tN = 0) ) SELECT split_items = SUBSTRING(@List, s.N1, ISNULL(NULLIF(CHARINDEX(@Delimiter, @List, s.N1), 0) - s.N1, 8000)) FROM cteStart AS s; 

La requête compare un EID avec une list d'EID. Vous pouvez résoudre le problème en faisant une jointure au lieu d'une sous-requête et en utilisant like supposant qu'un EID ne peut pas être une sous-string d'un autre.

Utiliser la requête Left Join. Cela sera facile pour vous