Example of using aggregation on nested tables, PL-SQL Programming

Example of Using Aggregation on Nested Tables

Example: How many students sat each exam

WITH C_ER AS (SELECT CourseId, CAST (TABLE (SELECT DISTINCT StudentId, Mark FROM EXAM_MARK AS EM WHERE EM.CourseId = C.CourseId) AS ROW ( StudentId SID, Mark INTEGER ) MULTISET) AS ExamResult FROM COURSE AS C) SELECT CourseId, (SELECT COUNT (*)  FROM TABLE (ER (ExamResult)) AS t) AS n FROM C_ER

Explanation

  • The WITH clause, occupying the first nine lines of the example, illustrates SQL's counterpart of Tutorial D's construct of the same name. It assigns the name, C_ER, to the result of Example. That name, C_ER, is then used in the FROM clause of the expression that follows the WITH clause. Note that here the name comes before AS and the expression defining it comes after. This is consistent with the analogous use of AS in CREATE VIEW statements.
  • TABLE(ER(ExamResult)) seems to be the only way of having a multiset valued column operated on as an element of a FROM clause-a simple column name is not allowed to appear here. TABLE(ExamResult) can't be used either, because when an invocation of TABLE appears as a FROM clause element, its operand is required to be, specifically, an invocation of a user-defined function. Assumed here ER defined like:

CREATE FUNCTION ER

(SM ROW ( StudentId SID, Mark INTEGER ) MULTISET )

RETURNS TABLE (StudentId SID, Mark INTEGER)

RETURN SM;

The type name TABLE ( StudentId SID, Mark INTEGER ) is actually just a synonym for ROW (StudentId SID, Mark INTEGER ) MULTISET). The misleading synonym is available only in a RETURNS clause and not as a parameter type, for example. So ER is actually a no-op, returning its input.

  • (SELECT COUNT(*) FROM TABLE(ER(ExamResult)) AS t) is a scalar subquery, yielding the cardinality of the multiset of rows that is the value of the column ExamResult in the current row of C_ER. Because we are using the expression to denote a scalar value rather than a table, naming the column would be pointless (apart, perhaps, from injecting a somewhat sarcastic element of purism). As COUNT(*) doesn't use a column name, Example is valid even if we omit the invocation of CAST to assign column names.
  • AS n then gives the resulting column the name n. Note that here the name comes after AS and the expression defining it comes before, in the same style as the use of AS to define the range variables C and EM in the example.
Posted Date: 1/18/2013 6:18:21 AM | Location : United States







Related Discussions:- Example of using aggregation on nested tables, Assignment Help, Ask Question on Example of using aggregation on nested tables, Get Answer, Expert's Help, Example of using aggregation on nested tables Discussions

Write discussion on Example of using aggregation on nested tables
Your posts are moderated
Related Questions
SELECT a.child_fname,a.child_lname,concat(b.parent_title,b.parent_fname), b.parent_lname,b.parent_tphone FROM child a,parent b WHERE a.parent_id=b.parent_id ORDER BY a.child_fnam

Parameter and Keyword Description:   table_reference: This keyword identifies the table or view that should be accessible when you execute the UPDATE statement, and for wh

SQL outer join SELECT * FROM IS_CALLED NATURAL LEFT JOIN IS_ENROLLED_ON Note that adding LEFT to an invocation of CROSS JOIN has no effect unless the right-hand operand

Definition of FROM - SQL Recall that the operand of FROM is denoted by a commalist, each element of that commalist being a table expression optionally accompanied by a range v

Dynamic SQL: The Most PL/SQL programs do a predictable, specific job. For illustration, a stored procedure may accept an employee number and salary increase, and then update t

%TYPE: This attribute gives the datatype of a formerly declared collection, cursor variable, object, field, record, database column, or variable. Datatype: This is simply

Renaming Columns - SQL SQL has no direct counterpart of RENAME. To derive the table on the right in Figure 4.4 from the table on the left, Tutorial D has IS_CALLED RENAME ( St

Dynamic Ranges The PL/SQL lets you determine the loop range dynamically at run time, as the example below shows: SELECT COUNT(empno) INTO emp_count FROM emp; FOR i IN 1..emp_cou

Declaring a Cursor The Forward references are not allowed in the PL/SQL. Therefore, you must declare a cursor before referencing it in other statements. Whenever you declare a

When Are Constraints Checked Under the model constraints are conceptually checked at all statement boundaries (and only at statement boundaries). By default the same is true