I already searched the mailing list archive and couldn't  find a similar
problem. So, here it is.

A  DEPENDENT  QUERY  PROBLEM

Suppose we want to execute the following query Q, which depends on queries
q1 and q2. These queries are given below.
The tables reside in a Microsoft Access97 database file. Restriction: we
must use these database, at least for now.
I want to display the query results in a web application using JSP pages
built with Jakarta Tag Libraries, especially DBTags Pre-Beta version 1.0
(downloaded 10/2/01). I'm using Tomcat 3.2.3 and J2SE 1.3 on a Windows98
machine.

Query Q:

SELECT  tblInvoice.CustomerID, tblInvoice.InvoiceID,
tblInvoice.DatePrepared, tblInvoice.InvoiceAmount, tblInvoice.Open,
TotalCredits, TotalPayments
FROM tblCustomer RIGHT JOIN
((tblInvoice LEFT JOIN q1 ON tblInvoice.InvoiceID = q1.InvoiceID)  LEFT JOIN
q2 ON tblInvoice.InvoiceID = q2.InvoiceID)
ON tblCustomer.CustomerID = tblInvoice.CustomerID
WHERE (((tblInvoice.DatePrepared)<#<%= request.getParameter("startDate")
%>#) AND ((tblInvoice.Open)=True))
ORDER BY tblInvoice.CustomerID, tblInvoice.InvoiceID;

Query q1:

     SELECT tblCredit.InvoiceID, Sum(tblCredit.Amount) AS TotalCredits
      FROM tblCredit
      WHERE (((tblCredit.Date)<=#<%= request.getParameter("startDate") %>#))
      GROUP BY tblCredit.InvoiceID;

Query q2:

    SELECT tblAllocation.InvoiceID, Sum(tblAllocation.AmountPaid) AS
TotalPayments
     FROM tblPayment RIGHT JOIN tblAllocation
     ON tblPayment.PaymentID = tblAllocation.PaymentID
     WHERE (((tblPayment.Date)<=#<%= request.getParameter("startDate") %>#))
     GROUP BY tblAllocation.InvoiceID;

Note that all these queries depend on the request parameter "startDate".
Queries q1 and q2 execute separately on different JSP pages without problem.

Question:

Using Jakarta DBTags Tag Library, how can this problem be solved without
using temporary or permanent working  tables to hold results for q1 and q2?

A solution based on working tables:
Using temporary or permanent working tables, the problem can be solved by
first executing q1 and q2 and inserting the results in working tables wtq1
and wtq2, respectively. Then, query Q can be computed based on these tables.
A big drawback of this solution is poor performance and db size increase.
Permanent working tables increase the size of the Access database,
considerably in some cases . Temporary working tables must be created and
deleted every time the associated queries are executed, which produces a
performance degradation in proportion to the frequency of computation of the
queries. More important, in some cases, including this one, regular users do
not have permission to create tables, therefore, the use of temporary work
tables is out of the question.

A solution without working tables?:
Using the <sql:query> tag, we can execute q1, which will produce resultSet
rset1. Then we can execute q2 to obtain resultSet rset2. (In both cases we
must use a resultSet per Statement.) One question is:
(1) How to refer to queries q1 and q2, for example, in the following segment
of query Q so that q1 and q2 are treated as if they were regular tables?

((tblInvoice LEFT JOIN q1 ON tblInvoice.InvoiceID = q1.InvoiceID)  LEFT JOIN
q2 ON tblInvoice.InvoiceID = q2.InvoiceID)

If there is a valid way to refer to q1 and q2 in the above statement, I
guess the problem can be solved.

(2) Also, is there any other way to compute query Q using DBTags?

I think we can use the Java scriplet <% int rset1.getInt(1); %> instead of
q1.InvoiceID in the above expression as long as the scriptlet is in the
scope of rset1. A similar expression can replace q2.InvoiceID.

I would really appreciate any help you can provide me.

Thanks a lot,

Alonso E. Rhenals









--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to