Счетчик применений SQL Cross - PullRequest
0 голосов
/ 23 сентября 2010

Я пытаюсь использовать CROSS APPLY в SQL, но хочу использовать результаты вызова только в том случае, если возвращаемое количество строк больше 1.

У меня есть следующий SQL:

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

В некоторых случаях CROSS APPLY возвращает несколько строк, но в подавляющем большинстве возвращает одну строку (поскольку все строки @tempTable имеют соответствующий результат из функции).Мне интересно только вставить те из них, которые имеют кратные соответствующие результаты из CROSS APPLY.

Я пытаюсь не вставлять все, а затем делать удаление впоследствии,Действительно интересно посмотреть, есть ли какое-либо агрегирующее действие, которое я могу применить к этому утверждению, как оно есть.

Есть идеи?

Редактировать: в ответ на ответ SQLMenace,Я получаю следующие результаты, где левый столбец является tempVal, средний столбец - crossVal, правый столбец - crossVal2:

a : 1 : z0

b : 1 : z0

a : 2 : z1

b : 2 : z1

c : 1 : z0

d : 1 : z0

Я хочу отбросить строки "c: 1: z0" и "d: 1: z0 ".Кроме того, это может повлиять на группировки, поэтому я упомяну об этом, мой последний запрос содержит два столбца, возвращаемых из функции, и один столбец из временной таблицы.

Конечный запрос в основном подсчитывает родителей строки tempTable, гдесуществует более одного родителя (возвращенного в виде таблицы из функции). Я хочу выполнить вставку и записать порядок родителя (снова возвращенный из функции).crossVal - это родительский идентификатор, а crossVal2 - это порядковый номер типа int.

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Поскольку вы хотите сгруппировать по количеству строк, возвращаемых перекрестной аппликацией, я бы поместил только одно выражение в вашу группу по. Вот почему вы получили 6 строк вместо 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
1 голос
/ 23 сентября 2010

попробуйте

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...