2010-10-11 7 views
0

Hallo Amis,requête pour sélectionner différents

je besoin d'une requête pour lancer un message d'erreur sur la comparaison avec table temp_invoice.

Il faut comparer le champ [Tâche resp #], contre le champ [PB-ID] dans PB_Responsbility table pour client = 3D

format temp_invoice

Concession Number [Task resp#] 

    TH-123     12345 
    TH-014     98065 
    TH-123     41027 
    TH-567     12345 
    TH-111     99765 
    TH-567     41027    
    TH-228     73095    
    TH-001     09129    
    TH-779     41027   
    TH-333     01029  
    TH-722     03489 

Cela devrait vérifier contre la table de base de données pour laquelle le client est 3D.

TABLEAU PB_Responsbility

[PB-ID]      Customer 
    09129      3D 
    98065      AB 
    12345      DC 
    41027      ZH 
    99765      3D 
    73095      UZ 

Si le client n'est pas 3D ou si [Tâche resp #] ne se trouve pas dans le tableau PB_Responsbility, il devrait lancer un message, en sélectionnant distinct [Tâche resp #] de la feuille Excel.

Ici la sortie est nécessaire, « incorrecte [Task resp #]: -. 12345,98065,41027,73095,01029,03489

J'ai écrit la requête si,

DECLARE @pb_id_msg VARCHAR(MAX) 
SET @pb_id_msg = '' 

SELECT @pb_id_msg = @pb_id_msg + ' ,' 
+ CONVERT(VARCHAR(10),[Task resp#]) FROM temp_invoice WHERE [Task resp#] NOT IN 
    (SELECT [PB-ID] FROM PB_Responsbility WHERE Customer = '3D') 
    GROUP BY CONVERT(VARCHAR(10),[Task resp#]). 

Cette est produit le résultat au besoin. Mais si je modifie la requête avec dISTINCT

SELECT DISTINCT @pb_id_msg = @pb_id_msg + ' ,' 
+ CONVERT(VARCHAR(10),[Task resp#]) FROM temp_invoice WHERE [Task resp#] NOT IN 
    (SELECT [PB-ID] FROM PB_Responsbility WHERE Customer = '3D') 

Il en résulte que 1 valeur. S'il vous plaît expliquez-moi, pourquoi la deuxième requête de sélection avec distincte ne fonctionne pas ??

Répondre

1

On dirait que SQL Server interprète distinct pour signifier que vous souhaitez seulement attribuer une valeur à la variable une fois.

Vous pouvez corriger cela en déplaçant le distincte à une sous-requête:

SELECT @pb_id_msg = @pb_id_msg + ' ,' + CONVERT(VARCHAR(10),[Task resp#]) 
FROM (
     SELECT DISTINCT [Task resp#] 
     FROM temp_invoice 
     WHERE [Task resp#] NOT IN 
       (
       SELECT [PB-ID] 
       FROM PB_Responsbility 
       WHERE Customer = '3D' 
       ) 
     ) as SubQueryAlias 
+0

Il probablement « échoue » Distinct pour la même raison, il « échoue » avec ORDER BY, http://www.sqlmag.com /article/sql-server/multi-row-variable-assignment-and-order-by.aspx –

+1

+1 Wow, Thanku beaucoup ... l'explication m'a donné un sourire. – satya

Questions connexes