Вы находитесь на странице: 1из 4

Cours Collection Subquery

● Permet la création d'une collection de type


MULTISET en utilisant le résultat d'une sous-
requêtes.
● Le MULTISET résultant est de type unnamed row
Collection Subquery par default.
les tables dérivées ● On ne peut utiliser que les résultat de colonne de
type MULTISET (le résultat LIST et SET n'est pas
encore pris en charge)

Ing Hassène FARHAT


Assistant Enseignement Supérieur Militaire
Académie Navale
V 0.2 Hassène FARHAT 2

Exemple Collection Subquery : ITEM


Le mot réservé ITEM permet à une sous requête de
CREATE TABLE custords ( c1 MULTISET ( type collection de ne pas créer un unamed row
ROW(cnum INT, shpchg MONEY(6,2)) NOT NULL), comme résultat de la requête.
c2 DATE); Restriction : la sous requête doit retourner une seule
colonne
CREATE TABLE custnums (
INSERT INTO custords VALUES ( c1 MULTISET(INT NOT NULL),
MULTISET (select customer_num, ship_charge c2 DATE);
from orders), INSERT INTO custnums VALUES (
TODAY); MULTISET(SELECT ITEM customer_num
FROM orders),
V 0.2 Hassène FARHAT 3 V 0.2 Hassène FARHAT 4
TODAY);
Collection Derived Tables (CDTs) Collection Derived Tables
● A collection-derived table est une table virtuelle
dans laquelle les valeurs d'un enregistrement
sont equivalents aux éléments d'une collection.
● Exemple :
CREATE TABLE customer (
customer_num SERIAL NOT NULL,
customer_type CHAR(1),
customer_name name_t,
customer_loc INTEGER,
contact_dates LIST(datetime year to day not null),
cust_discount PERCENT,
credit_status CHAR(1)
V 0.2
); Hassène FARHAT 5 V 0.2 Hassène FARHAT 6

Syntaxe Restrictions
● Syntaxe : TABLE (collection_expression) [ [AS] L'expression de collection doit retourner une
alias] [(derived_columns)] seule collection.
● Exemple : SELECT cdate FROM TABLE(
(SELECT contact_dates FROM customer
SELECT cdate FROM TABLE( (SELECT where customer_num >= 503)) c_table (cdate)
contact_dates FROM customer where
#^
customer_num = 503) ) c_table (cdate)
● Resultats: # 284: A subquery has returned not exactly one
row.
cdate
1998-08-02 #
1998-08-03
V 0.2 Hassène FARHAT 7 V 0.2 Hassène FARHAT 8
Restrictions Restriction avec l'utilisation des CDT
● Single Collection Column Only ● Une CDT est en lecture seule : pas d'insertion,
SELECT cdate FROM TABLE( update, delete juste select.
● Si le type de collection est LIST, la CDT ne
(SELECT contact_dates a, contact_dates b
préserve pas l'ordre.
FROM customer where customer_num = 503 ● La CDT doit être indépendante des autres
) c_table (cdate)
tables dans la clause from
#^ ● SELECT COUNT(*) FROM parents,

# 574: A subquery has returned not exactly one TABLE(parents.children) c_table WHERE
column. parents.id = 1001
● retourne une erreur car parents.children
#
V 0.2 Hassène FARHAT 9 V 0.2
dépend de la table Hassène
parentsFARHAT 10

Exercices Solutions
● Créer une table VIP contenenat les informations : ● CREATE TABLE vips (
vip_num SERIAL, first name, last name, vipnum SERIAL,
children SET contient un type un-named row fname VARCHAR(30),
contenant le nom et la date de naissance de l'enfant lname VARCHAR(30),
children SET(ROW(cname VARCHAR(30),bday
● Ajouter les enregistrements suivants : DATE) NOT NULL) );
– VIP: JAMES DILLMAN ,Children: JOHN ● INSERT INTO vips VALUES ( 0, “JAMES”,

2/8/1981, LISA 5/18/1997, STEVEN 8/19/1998 ”DILLMAN”,


– VIP: HELEN TERLOP, Children: DAN SET{ ROW(“JOHN”,”2/8/1981”),
2/8/1967, LISA 2/17/1965 ROW(“LISA”,”5/18/1997”),
ROW(“STEVEN”,”8/19/1998”)});
V 0.2 Hassène FARHAT 11 V 0.2 Hassène FARHAT 12
Solutions (suite) Exercices
INSERT INTO vips VALUES ( ● Write a query to determine the birthday of VIP
0, “HELEN”,”TERLOP”, JAMES DILLMAN’s son named JOHN. You are
SET{ only interested in JOHN’s birthday and not the other
ROW(“DAN”,”2/8/1967”), children in your output.
ROW(“LISA”,”2/17/1965”)
}
);

V 0.2 Hassène FARHAT 13 V 0.2 Hassène FARHAT 14

Solution
●SELECT fname, lname, ( SELECT c_table.bday
FROM TABLE (vips.children) c_table WHERE
c_table.cname = “JOHN” ) johns_bday
FROM vips WHERE vipnum = 1;

Resultats: Bibliographie
Using Collection Subqueries and Derived Tables, Informix Software, 2000
fname lname johns_bday
JAMES DILLMAN 02/08/1981

V 0.2 Hassène FARHAT 15 V 0.2 Hassène FARHAT 16

Вам также может понравиться