Я знаю, что есть несколько сообщений о том, как BAD попытаться выполнить цикл на SQL Server в хранимой процедуре. Но я не совсем понял, что я пытаюсь сделать. Мы используем возможность подключения данных, которая может быть напрямую связана с Excel.Альтернативная альтернатива циклу в SQL Server
Я видел несколько сообщений, в которых несколько человек сказали, что могут конвертировать большинство циклов в стандартный запрос. Но для моей жизни у меня проблемы с этим.
Мне нужно все custID
s, у кого есть заказы прямо перед случаем типа 38,40. Но только получите их, если нет другого порядка между событием и порядком в первом запросе.
Таким образом, существует 3 части. Сначала я запрашиваю для всех заказов (таблицу заказов) на основе временного интервала во временную таблицу.
Select into temp1 odate, custId from orders where odate>'5/1/12'
Тогда я мог бы использовать временную таблицу для внутреннего соединения на второй таблице, чтобы получить событие клиента (LogEvent таблицу), что, возможно, произошло какое-то время в прошлом до текущего заказа.
Select into temp2 eventdate, temp1.custID from LogEvent inner join temp1 on
temp1.custID=LogEvent.custID where EventType in (38,40) and temp1.odate>eventdate
order by eventdate desc
Проблема здесь состоит в том, что запросы я пытаюсь запустить возвращает все строки для каждого из клиентов с первого запроса, в котором я только хочу последним для каждого клиента. Так вот где на стороне клиента я бы зациклился, чтобы получить только одно Событие, а не все старые. Но поскольку все запросы должны выполняться внутри Excel, я не могу на самом деле зацикливаться на клиентской стороне.
Третий шаг затем может использовать результаты второго запроса, чтобы проверить, произошло ли событие между большинством текущего порядка и любым предыдущим заказом. Мне нужны только данные, где событие предшествует порядку, и никаких других заказов между ними нет.
Select ordernum, shopcart.custID from shopcart right outer join temp2 on
shopcart.custID=temp2.custID where shopcart.odate >= temp2.eventdate and
ordernum is null
Есть ли способ, чтобы упростить это и сделать его набор на основе работать в SQL Server, а не какой-то цикл, который я это выполнить на клиенте?
какая версия sql-сервера? –
Я использую 2005 и 2008 годы. Мы начинаем мигрировать в 2008 году, но не закончили, поэтому мне нужно решить это и в 2005 году. – CaptainBli
Это 1 мая или 5 января? Пожалуйста, используйте безопасные, недвусмысленные форматы для литературных дат, например. ''20120501'' ... SQL Server никогда не будет неверно истолковывать это, а также ваши пользователи, коллеги или читатели здесь. –