2010-09-23 4 views
0

Je suis en train d'utiliser CROSS APPLY dans SQL, mais seulement veulent utiliser les résultats de l'appel si le nombre de lignes de retour est supérieur à 1.Cross SQL Appliquer le comte

je l'instruction SQL suivante:

INSERT INTO @dest (val1, val2, val3) 
SELECT   t2.crossVal, t2.crossVal2, t1.tempVal 
FROM  @tempTable t1 
CROSS APPLY dbo.TableValuedFunction(t1.IDColumn) t2 

Le CROSS APPLY renvoie plusieurs lignes dans certains cas, mais dans la grande majorité renvoie une ligne (car toutes les lignes @tempTable ont un résultat correspondant à la fonction). Je suis intéressant en insérant seulement ceux qui ont plusieurs résultats correspondants du CROSS APPLY.

J'essaie d'éviter d'insérer tout puis de faire une suppression après. Vraiment intéressé de voir s'il y a une sorte d'action d'agrégation que je peux appliquer à cette déclaration telle qu'elle est.

Des idées?

Modifier: en réponse à la réponse de SQLMenace. Je reçois les résultats suivants où la colonne de gauche est tempVal, la colonne du milieu est crossVal, la colonne de droite est crossVal2:

a : 1 : z0 

b : 1 : z0 

a : 2 : z1 

b : 2 : z1 

c : 1 : z0 

d : 1 : z0 

Je veux fossé les lignes « c: 1: Z0 » et « d: 1 : z0 ". En outre, il peut affecter les regroupements, je vais le mentionner, ma dernière requête a deux colonnes retournées par la fonction et une de la table temporaire. La requête de fin est essentiellement de compter les parents de la ligne tempTable, où il y a plus d'un parent (retourné comme une table de la fonction) Je veux faire l'insertion et enregistrer l'ordre du parent (encore une fois retourné de la fonction). crossVal est l'ID parent et crossVal2 est l'ordre en tant qu'int.

Répondre

1

essayer cette

INSERT INTO @dest (val1, val2) 
SELECT   t2.crossVal, t1.tempVal 
FROM   @tempTable t1 
CROSS APPLY dbo.TableValuedFunction(t1.IDColumn) t2 
GROUP BY t2.crossVal, t1.tempVal 
HAVING COUNT(*) > 1 
+0

merci pour cela. Je l'ai essayé, et il a réduit drastiquement le jeu de résultats, mais je ne pense pas que cela fonctionne entièrement - j'ai modifié ma question pour montrer les résultats que je reçois. –

1

Puisque vous voulez groupe par le nombre de lignes renvoyées par la croix aply, je ne mettre une expression dans votre groupe par. C'est pourquoi vous obteniez 6 lignes au lieu de 4:

INSERT INTO @dest (val1, val2) 
SELECT   t2.crossVal, t1.tempVal 
FROM   @tempTable t1 
CROSS APPLY dbo.TableValuedFunction(t1.IDColumn) t2 
GROUP BY t2.crossVal 
HAVING COUNT(*) > 1