2016-05-31 5 views
-2
DECLARE @run_date DATETIME 

SELECT @run_date = '2016/05/30' 

SELECT PAYMENT_LINE.active, 
     PAYMENT_LINE.alloc_date, 
     PAYMENT_LINE.allocation_ind, 
     PAYMENT_LINE.amount, 
     PAYMENT_LINE.fund_charge_id, 
     PAYMENT_LINE.paid_td, 
     PAYMENT_LINE.payment_id, 
     PAYMENT_LINE.payment_line_id, 
     PAYMENT_LINE.payment_type_code, 
     PAYMENT_LINE.period, 
     PAYMENT_LINE.reference_id, 
     PAYMENT_LINE.reversal_date, 
     PAYMENT_LINE.src_id 

     INTO #pym 
FROM PAYMENT_LINE 
WHERE alloc_date IS NOT NULL 
     AND alloc_date < @run_date 

/*DELETE FROM #pym WHERE reversal_date IS NULL*/ 



DELETE 
FROM #pym 
WHERE reversal_date > @run_date 



SELECT payment_id, 
     Total = SUM(amount) 

     INTO #pym1 
FROM #pym 
GROUP BY 
     payment_id 



SELECT PAYMENT.payment_id, 
     PAYMENT.payment_amount, 
     Total 

     INTO #pym2 
FROM #pym1, 
     PAYMENT 
WHERE PAYMENT.payment_id = #pym1.payment_id 
GROUP BY 
     PAYMENT.payment_id 
HAVING Total > PAYMENT.payment_amount 



SELECT MANUFACTURER.manufacturer_id, 
     MANUFACTURER.manufacturer_name, 
     alloc_date, 
     PAYMENT.payment_id, 
     PAYMENT.payment_amount, 
     Total 

     INTO #pym3 
FROM #pym2, 
     PAYMENT, 
     MANUFACTURER, 
     PAYMENT_LINE 
WHERE Total > PAYMENT.payment_amount 



SELECT payment_id, 
     Total_payment = SUM(payment_amount - Total) 

     INTO #pym4 
FROM #pym3 
GROUP BY 
     payment_id 



SELECT MANUFACTURER.manufacturer_id, 
     MANUFACTURER.manufacturer_name, 
     alloc_date, 
     PAYMENT.payment_id, 
     PAYMENT.payment_amount, 
     Total, 
     Total_payment 
FROM #pym4, 
     #pym2, 
     PAYMENT, 
     MANUFACTURER, 
     PAYMENT_LINE 
+2

[Вредные привычки пинать: использование старого стиля JOIN и] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using -old-style-joins.aspx) - этот стиль таблиц * в стиле старого стиля * с заменой на запятую был заменен синтаксисом * надлежащего * ANSI 'JOIN' в стандарте ANSI - ** 92 ** SQL (** больше чем 20 лет назад), и его использование не рекомендуется –

+0

Здесь вы делаете много бесполезной работы, почему бы вам продолжать создавать эти временные таблицы, а затем удалять их сразу? Просьба также предоставить некоторые типовые данные и ожидаемый результат. –

+0

Последний 'SELECT' без каких-либо предикатов' JOIN' ... Почему? – Devart

ответ

1

Я взглянул на этот запрос, и это не имеет большого смысла, без дополнительной информации. Первые три запроса;

SELECT PAYMENT_LINE.active, 
    PAYMENT_LINE.alloc_date, 
    PAYMENT_LINE.allocation_ind, 
    PAYMENT_LINE.amount, 
    PAYMENT_LINE.fund_charge_id, 
    PAYMENT_LINE.paid_td, 
    PAYMENT_LINE.payment_id, 
    PAYMENT_LINE.payment_line_id, 
    PAYMENT_LINE.payment_type_code, 
    PAYMENT_LINE.period, 
    PAYMENT_LINE.reference_id, 
    PAYMENT_LINE.reversal_date, 
    PAYMENT_LINE.src_id 

    INTO #pym 
FROM PAYMENT_LINE 
WHERE alloc_date IS NOT NULL 
    AND alloc_date < @run_date 

DELETE 
FROM #pym 
WHERE reversal_date > @run_date 



SELECT payment_id, 
    Total = SUM(amount) 

    INTO #pym1 
FROM #pym 
GROUP BY 
    payment_id 

Может ли это быть объединено в это;

SELECT payment_id, 
     Total = SUM(amount) 
     INTO #pym 
FROM PAYMENT_LINE 
WHERE alloc_date IS NOT NULL 
     AND alloc_date < @run_date 
     AND reversal_date <= @run_date 
GROUP BY payment_id 

Вам действительно нужно прочитать правильный синтаксис соединения, здесь вы используете действительно старый синтаксис;

SELECT PAYMENT.payment_id, 
    PAYMENT.payment_amount, 
    Total 

    INTO #pym2 
FROM #pym1, 
    PAYMENT 
WHERE PAYMENT.payment_id = #pym1.payment_id 
GROUP BY 
    PAYMENT.payment_id 
HAVING Total > PAYMENT.payment_amount 

Пожалуйста, прочитайте Аарон Bertrands статьи здесь http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx

Кроме того, необходимо обратить внимание на декартовой присоединяется и то, что они влекут за собой, окончательный запрос будет испортить ваши данные во многих отношениях;

SELECT MANUFACTURER.manufacturer_id, 
    MANUFACTURER.manufacturer_name, 
    alloc_date, 
    PAYMENT.payment_id, 
    PAYMENT.payment_amount, 
    Total, 
    Total_payment 
FROM #pym4, 
    #pym2, 
    PAYMENT, 
    MANUFACTURER, 
    PAYMENT_LINE 

Вы должны также ознакомиться с использованием псевдонимов таблиц, это упростит вашу роль в долгосрочной перспективе;

When to use SQL Table Alias

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

http://www.techrepublic.com/article/use-sql-subselects-to-consolidate-queries/

Смежные вопросы