john_revelator
03-01-2010, 20:42
Ciao a tutti e buon anno come prima cosa. :)
Mi servirebbero dei chiarimenti circa l'utilizzo di any, all ed exists all'interno delle subquery. Ho guardato un pò in rete ma rimango pieno di dubbi.
Questo è uno dei tanti link che ho trovato
http://www.java2s.com/Code/SQL/Select-Clause/SubquerywithALLcommand.htm
nel quale viene riportato questo dump:
CREATE TABLE Articles (
ArticleID SMALLINT NOT NULL PRIMARY KEY,
ArticleTitle VARCHAR(60) NOT NULL,
Copyright YEAR NOT NULL
)
ENGINE=INNODB;
INSERT INTO Articles VALUES (12786, 'How write a paper', 1934),
(13331, 'Publish a paper', 1919),
(14356, 'Sell a paper', 1966),
(15729, 'Buy a paper', 1932),
(16284, 'Conferences', 1996),
(17695, 'Journal', 1980),
(19264, 'Information', 1992),
(19354, 'AI', 1993);
CREATE TABLE Authors (
AuthID SMALLINT NOT NULL PRIMARY KEY,
AuthorFirstName VARCHAR(20),
AuthorMiddleName VARCHAR(20),
AuthorLastName VARCHAR(20)
)
ENGINE=INNODB;
INSERT INTO Authors VALUES (1006, 'Henry', 'S.', 'Thompson'),
(1007, 'Jason', 'Carol', 'Oak'),
(1008, 'James', NULL, 'Elk'),
(1009, 'Tom', 'M', 'Ride'),
(1010, 'Jack', 'K', 'Ken'),
(1011, 'Mary', 'G.', 'Lee'),
(1012, 'Annie', NULL, 'Peng'),
(1013, 'Alan', NULL, 'Wang'),
(1014, 'Nelson', NULL, 'Yin');
CREATE TABLE AuthorArticle (
AuthID SMALLINT NOT NULL,
ArticleID SMALLINT NOT NULL,
PRIMARY KEY (AuthID, ArticleID),
FOREIGN KEY (AuthID) REFERENCES Authors (AuthID),
FOREIGN KEY (ArticleID) REFERENCES Articles (ArticleID)
)
ENGINE=INNODB;
INSERT INTO AuthorArticle VALUES (1006, 14356),
(1008, 15729),
(1009, 12786),
(1010, 17695),
(1011, 15729),
(1012, 19264),
(1012, 19354),
(1014, 16284);
L'ho caricato in mysql e ho cercato di capirne la logica.
Nell'esempio viene eseguita questa query:
SELECT ArticleTitle, Copyright
FROM Articles
WHERE Copyright > ANY
(
SELECT b.copyright
FROM Articles AS b JOIN AuthorArticle AS ab USING (ArticleID)
JOIN Authors AS a USING (AuthID)
WHERE AuthorLastName='Yin'
)
ORDER BY ArticleTitle;
la quale non rende alcun record.
La query interna invece
SELECT b.copyright
FROM Articles AS b JOIN AuthorArticle AS ab USING (ArticleID)
JOIN Authors AS a USING (AuthID)
WHERE AuthorLastName='Yin'
restituisce 1996.
Vado quindi a guardarmi la tabella articles e capisco che è giusto ottenere un result set vuoto in quanto 1996 è il copyright maggiore.
Se modifico la query in questo modo:
SELECT ArticleTitle, Copyright
FROM Articles
WHERE Copyright > ANY
(
SELECT b.copyright
FROM Articles AS b JOIN AuthorArticle AS ab USING (ArticleID)
JOIN Authors AS a USING (AuthID)
WHERE AuthorLastName='Ken'
)
ORDER BY ArticleTitle;
la query interna mi restituisce 1980 e di conseguenza la query complessiva mi restituirà 3 record, quelli con copyright 1996,1993 e 1992.
Peraltro se riscrivo la query così
SELECT ArticleTitle, Copyright
FROM Articles
WHERE Copyright >
(
SELECT b.copyright
FROM Articles AS b JOIN AuthorArticle AS ab USING (ArticleID)
JOIN Authors AS a USING (AuthID)
WHERE AuthorLastName='Ken'
)
ORDER BY ArticleTitle;
cioè uguale e identica senza la clausola ANY ottengo lo stesso identico risultato. Qualcuno è in grado di spiegarmi, magari con qualche esempio pratico, l'effettiva utilità di queste clausole. Anche la clausola exists non mi è affatto chiara. Ciao e grazie per l'attenzione. :)
Mi servirebbero dei chiarimenti circa l'utilizzo di any, all ed exists all'interno delle subquery. Ho guardato un pò in rete ma rimango pieno di dubbi.
Questo è uno dei tanti link che ho trovato
http://www.java2s.com/Code/SQL/Select-Clause/SubquerywithALLcommand.htm
nel quale viene riportato questo dump:
CREATE TABLE Articles (
ArticleID SMALLINT NOT NULL PRIMARY KEY,
ArticleTitle VARCHAR(60) NOT NULL,
Copyright YEAR NOT NULL
)
ENGINE=INNODB;
INSERT INTO Articles VALUES (12786, 'How write a paper', 1934),
(13331, 'Publish a paper', 1919),
(14356, 'Sell a paper', 1966),
(15729, 'Buy a paper', 1932),
(16284, 'Conferences', 1996),
(17695, 'Journal', 1980),
(19264, 'Information', 1992),
(19354, 'AI', 1993);
CREATE TABLE Authors (
AuthID SMALLINT NOT NULL PRIMARY KEY,
AuthorFirstName VARCHAR(20),
AuthorMiddleName VARCHAR(20),
AuthorLastName VARCHAR(20)
)
ENGINE=INNODB;
INSERT INTO Authors VALUES (1006, 'Henry', 'S.', 'Thompson'),
(1007, 'Jason', 'Carol', 'Oak'),
(1008, 'James', NULL, 'Elk'),
(1009, 'Tom', 'M', 'Ride'),
(1010, 'Jack', 'K', 'Ken'),
(1011, 'Mary', 'G.', 'Lee'),
(1012, 'Annie', NULL, 'Peng'),
(1013, 'Alan', NULL, 'Wang'),
(1014, 'Nelson', NULL, 'Yin');
CREATE TABLE AuthorArticle (
AuthID SMALLINT NOT NULL,
ArticleID SMALLINT NOT NULL,
PRIMARY KEY (AuthID, ArticleID),
FOREIGN KEY (AuthID) REFERENCES Authors (AuthID),
FOREIGN KEY (ArticleID) REFERENCES Articles (ArticleID)
)
ENGINE=INNODB;
INSERT INTO AuthorArticle VALUES (1006, 14356),
(1008, 15729),
(1009, 12786),
(1010, 17695),
(1011, 15729),
(1012, 19264),
(1012, 19354),
(1014, 16284);
L'ho caricato in mysql e ho cercato di capirne la logica.
Nell'esempio viene eseguita questa query:
SELECT ArticleTitle, Copyright
FROM Articles
WHERE Copyright > ANY
(
SELECT b.copyright
FROM Articles AS b JOIN AuthorArticle AS ab USING (ArticleID)
JOIN Authors AS a USING (AuthID)
WHERE AuthorLastName='Yin'
)
ORDER BY ArticleTitle;
la quale non rende alcun record.
La query interna invece
SELECT b.copyright
FROM Articles AS b JOIN AuthorArticle AS ab USING (ArticleID)
JOIN Authors AS a USING (AuthID)
WHERE AuthorLastName='Yin'
restituisce 1996.
Vado quindi a guardarmi la tabella articles e capisco che è giusto ottenere un result set vuoto in quanto 1996 è il copyright maggiore.
Se modifico la query in questo modo:
SELECT ArticleTitle, Copyright
FROM Articles
WHERE Copyright > ANY
(
SELECT b.copyright
FROM Articles AS b JOIN AuthorArticle AS ab USING (ArticleID)
JOIN Authors AS a USING (AuthID)
WHERE AuthorLastName='Ken'
)
ORDER BY ArticleTitle;
la query interna mi restituisce 1980 e di conseguenza la query complessiva mi restituirà 3 record, quelli con copyright 1996,1993 e 1992.
Peraltro se riscrivo la query così
SELECT ArticleTitle, Copyright
FROM Articles
WHERE Copyright >
(
SELECT b.copyright
FROM Articles AS b JOIN AuthorArticle AS ab USING (ArticleID)
JOIN Authors AS a USING (AuthID)
WHERE AuthorLastName='Ken'
)
ORDER BY ArticleTitle;
cioè uguale e identica senza la clausola ANY ottengo lo stesso identico risultato. Qualcuno è in grado di spiegarmi, magari con qualche esempio pratico, l'effettiva utilità di queste clausole. Anche la clausola exists non mi è affatto chiara. Ciao e grazie per l'attenzione. :)