Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[SQLite] jointure

10 réponses
Avatar
unbewusst.sein
j'ai deux tables : 'devicephonebook' et 'extraphonebook'

je cherche à ramener toutes les colonnes de ces deux tables.
par exemple :
SELECT DISTINCT * FROM devicephonebook AS d, extraphonebook AS e WHERE
d.UID = e.UID ORDER BY d.fullLastName ;

fonctione mais, évidemment, ne ramène pas les lignes de
'devicephonebook' dont l'UID n'a pas d'équivalent dans 'extraphonebook'.

comme son nom l'indique *extra*phonebook ajoute des colonnes non
nécessaires.

comment donc ramener toutes les colonnes de 'devicephonebook' avec
celles de 'extraphonebook' quand elles existent ?

j'ai essayé une jointure :
SELECT DISTINCT * FROM devicephonebook, extraphonebook ORDER BY
fullLastName, timeStamp , RIGHT JOIN USING UID ;

mais là, j'ai une erreur de syntaxe :
[SQLITE_ERROR 1] : near "JOIN": syntax error

pourtant la docum me donne :
join-op ::= , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER |
CROSS] JOIN
join-args ::= [ON expr] [USING ( id-list )]

bon, comme, un peu plus haut dans la docum syntaxique il y a :
sql-statement ::= SELECT [ALL | DISTINCT] result [FROM table-list]
[WHERE expr]
[GROUP BY expr-list]
[HAVING expr]
[compound-op select]*
[ORDER BY sort-expr-list]
[LIMIT integer [( OFFSET | , ) integer]]


et :

table-list ::= table [join-op table join-args]*


je me dis que mon "ORDER BY" doit-être placé à la fin donc je change en
:

SELECT DISTINCT * FROM devicephonebook, RIGHT JOIN ON extraphonebook
USING UID ORDER BY fullLastName, timeStamp;

et là j'ai une erreur "semblable" :
[SQLITE_ERROR 1] : near "ON": syntax error

je trouve les définitions syntaxiques de SQLite un peu laconiques, y a
t'il des exemples de ce genre qqpart ?


--
Une Bévue

10 réponses

Avatar
unbewusst.sein
Une Bévue wrote:


je trouve les définitions syntaxiques de SQLite un peu laconiques, y a
t'il des exemples de ce genre qqpart ?



j'ai trouvé (<http://www.shokhirev.com/nikolai/abc/sql/joins.html>) :

SELECT DISTINCT * FROM devicephonebook AS d LEFT OUTER JOIN
extraphonebook AS e ON d.UID = e.UID ORDER BY fullLastName, timeStamp;

qui semble marcher après un premier essai...
--
Une Bévue
Avatar
Mickaël Wolff
Une Bévue a écrit :
j'ai essayé une jointure :
SELECT DISTINCT * FROM devicephonebook, extraphonebook ORDER BY
fullLastName, timeStamp , RIGHT JOIN USING UID ;

mais là, j'ai une erreur de syntaxe :
[SQLITE_ERROR 1] : near "JOIN": syntax error

pourtant la docum me donne :
join-op ::= , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER |
CROSS] JOIN
join-args ::= [ON **expr**] [USING ( id-list )]



Vu que tu as trouvé une jointure qui correspond plus à ce que tu
cherchais, je vais juste t'indiquer la bonne syntaxe d'après les
éléments de notation que tu as donné.
expr correspond à une expression à évaluer, comme dans une clause where :

SELECT DISTINCT * FROM devicephonebook as d
RIGHT JOIN extraphonebook as e
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp ;

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
unbewusst.sein
Mickaël Wolff wrote:


Vu que tu as trouvé une jointure qui correspond plus à ce que tu
cherchais, je vais juste t'indiquer la bonne syntaxe d'après les
éléments de notation que tu as donné.
expr correspond à une expression à évaluer, comme dans une clause where :

SELECT DISTINCT * FROM devicephonebook as d
RIGHT JOIN extraphonebook as e
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp ;



ouais, merci beaucoup pour cette réponse, mais, deux remarques :

- 1 - la commande ci-dessus me donne :
[SQLITE_ERROR 1] : RIGHT and FULL OUTER JOINs are not currently
supported

pourtant c'est dans la page sur la syntaxe...

- 2 - je suis ok pour [ON **expr**] mais j'ai utilisé [USING (id-list)]
(avec ou sans parenthèses) et l'erreur m'est donnée sur le "ON"
(apparemment valide pour une autre base que SQLite. finalement quand je
corrige ma syntaxe de la commande premièrement postée :

sql="SELECT DISTINCT * FROM devicephonebook RIGHT JOIN extraphonebook
USING ( UID ) ORDER BY fullLastName, timeStamp;"

je finis par :

RIGHT and FULL OUTER JOINs are not currently supported ;-)

j'imagine donc que les pages sur la syntaxe SQLite donnent la syntaxe au
futur...

en googleisant j'ai d'ailleurs trouvé "LEFT OUTER JOIN" comme un
"workaround" de ce qui n'est pas encore supporté avec SQLite.

en tk, merci de m'avoir fait progresser dans la lecture des specs
syntaxiques !

--
Une Bévue
Avatar
JGP_NoMail
Le 09/07/2008 11:36, Une Bévue a écrit :
Mickaël Wolff wrote:



[snip]
SELECT DISTINCT * FROM devicephonebook as d
RIGHT JOIN extraphonebook as e
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp ;



ouais, merci beaucoup pour cette réponse, mais, deux remarques :

- 1 - la commande ci-dessus me donne :
[SQLITE_ERROR 1] : RIGHT and FULL OUTER JOINs are not currently
supported




il suffit d'inverser l'ordre des tables
SELECT DISTINCT * FROM extraphonebook as e
LEFT JOIN devicephonebook as d
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp ;


[snip]
Avatar
unbewusst.sein
JGP_NoMail wrote:


il suffit d'inverser l'ordre des tables
SELECT DISTINCT * FROM extraphonebook as e
LEFT JOIN devicephonebook as d
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp ;



OK, merci, mais en quoi donnerait-elle un résultat différent de :
SELECT DISTINCT * FROM devicephonebook AS d
LEFT OUTER JOIN extraphonebook AS e
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp;
--
Une Bévue
Avatar
SQLpro
Avec ou sans le mot clef OUTER c'est équivalent, ce mot clef étant
facultatif.
Visiblement SQL lite est tellement "light" qu'il ne supporte pas les
jointures externes.

Un paliatif serait de faire une union du genre :
SELECT DISTINCT *
FROM devicephonebook AS d
INNER JOIN extraphonebook AS e
ON d.UID = e.UID
UNION ALL
SELECT DISTINCT *, NULL, NULL, NULL ... --> autant de NULL que de
colonnes dans la table extraphonebook
FROM devicephonebook
WHERE UID NOT IN (SELECT UID
FROM extraphonebook)
ORDER BY fullLastName, timeStamp;

A supposer que SQL Lite suporte les sous requêtes !

A +

PS : sur les jointures en particulier http://sqlpro.developpez.com/cours/sq laz/jointures/

Frédéric BROUARD - SQLpro - MVP SQL Server
Spécialiste SQL/BD modélisation de données
SQL & SGBDR http://sqlpro.developpez.com/
Expert SQL Server : http://www.sqlspot.com
audits - optimisation - tuning - formation

On 9 juil, 22:46, (Une
Bévue) wrote:
JGP_NoMail wrote:

> il suffit d'inverser l'ordre des tables
> SELECT DISTINCT * FROM extraphonebook as e
> LEFT JOIN devicephonebook as d
> ON d.UID = e.UID
> ORDER BY fullLastName, timeStamp ;

OK, merci, mais en quoi donnerait-elle un résultat différent de :
SELECT DISTINCT * FROM devicephonebook AS d
LEFT OUTER JOIN extraphonebook AS e
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp;
--
Une Bévue
Avatar
JGP_NoMail
Le 09/07/2008 22:46, Une Bévue a écrit :
JGP_NoMail wrote:

il suffit d'inverser l'ordre des tables
SELECT DISTINCT * FROM extraphonebook as e
LEFT JOIN devicephonebook as d
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp ;





Retourne l'ensemble des éléments commun au 2 tables + les éléments de la
table gauche qui ne n'ont pas d'UDI dans la table droite => tous les
éléments de extraphonebook ce qui est équivalent à la requête de Mickaël :

SELECT DISTINCT * FROM *devicephonebook* as d
*RIGHT* JOIN extraphonebook as e
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp ;

ou on retourne l'ensemble des éléments commun au 2 tables + les éléments
de la table *DROITE* qui ne n'ont pas d'UDI dans la table *GAUCHE* =>
tous les éléments de extraphonebook.



OK, merci, mais en quoi donnerait-elle un résultat différent de :
SELECT DISTINCT * FROM devicephonebook AS d
LEFT OUTER JOIN extraphonebook AS e
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp;



Ici, on obtient donc tous les éléments de devicephonebook.

JGP
Avatar
JGP_NoMail
Le 10/07/2008 08:42, SQLpro a écrit :
Avec ou sans le mot clef OUTER c'est équivalent, ce mot clef étant
facultatif.


Rooh !!! tu as du mal lire, l'ordre des tables et inversée, il n'y a pas
que le mot OUTER qui change.

Visiblement SQL lite est tellement "light" qu'il ne supporte pas les
jointures externes.



Si, il supporte les jointure externes, mais seulement la "LEFT OUTER".


Un paliatif serait de faire une union du genre :
SELECT DISTINCT *
FROM devicephonebook AS d
INNER JOIN extraphonebook AS e
ON d.UID = e.UID
UNION ALL
SELECT DISTINCT *, NULL, NULL, NULL ... --> autant de NULL que de
colonnes dans la table extraphonebook
FROM devicephonebook
WHERE UID NOT IN (SELECT UID
FROM extraphonebook)
ORDER BY fullLastName, timeStamp;



Correspond à la deuxième requête, et fonctionne.

A supposer que SQL Lite suporte les sous requêtes !



Il supporte aussi les sous requêtes.


A +

PS : sur les jointures en particulier http://sqlpro.developpez.com/cours/sqlaz/jointures/



A lire pour les débutants !

JGP
Avatar
unbewusst.sein
JGP_NoMail wrote:

>> il suffit d'inverser l'ordre des tables
>> SELECT DISTINCT * FROM extraphonebook as e
>> LEFT JOIN devicephonebook as d
>> ON d.UID = e.UID
>> ORDER BY fullLastName, timeStamp ;

Retourne l'ensemble des éléments commun au 2 tables + les éléments de la
table gauche qui ne n'ont pas d'UDI dans la table droite => tous les
éléments de extraphonebook ce qui est équivalent à la requête de Mickaël :

SELECT DISTINCT * FROM *devicephonebook* as d
*RIGHT* JOIN extraphonebook as e
ON d.UID = e.UID
ORDER BY fullLastName, timeStamp ;

ou on retourne l'ensemble des éléments commun au 2 tables + les éléments
de la table *DROITE* qui ne n'ont pas d'UDI dans la table *GAUCHE* =>
tous les éléments de extraphonebook.


>
> OK, merci, mais en quoi donnerait-elle un résultat différent de :
> SELECT DISTINCT * FROM devicephonebook AS d
> LEFT OUTER JOIN extraphonebook AS e
> ON d.UID = e.UID
> ORDER BY fullLastName, timeStamp;

Ici, on obtient donc tous les éléments de devicephonebook.




OK, merci bien, je pense avoir pigé, reste à appliquer...
--
Une Bévue
Avatar
unbewusst.sein
SQLpro wrote:

Avec ou sans le mot clef OUTER c'est équivalent, ce mot clef étant
facultatif.
Visiblement SQL lite est tellement "light" qu'il ne supporte pas les
jointures externes.



je n'ai pas le choix, le sqlite3 en question est embarqué dans l'unix de
mon téléphone portable...

je cherche à faire une synchro entre la base du portable et mon carnet
d'adresse sur mac...

Un paliatif serait de faire une union du genre :
SELECT DISTINCT *
FROM devicephonebook AS d
INNER JOIN extraphonebook AS e
ON d.UID = e.UID
UNION ALL
SELECT DISTINCT *, NULL, NULL, NULL ... --> autant de NULL que de
colonnes dans la table extraphonebook
FROM devicephonebook
WHERE UID NOT IN (SELECT UID
FROM extraphonebook)
ORDER BY fullLastName, timeStamp;

A supposer que SQL Lite suporte les sous requêtes !

A +

PS : sur les jointures en particulier
http://sqlpro.developpez.com/cours/sqlaz/jointures/



OK, merci, je vais re-relire ce tuto, même si je ne suis pas sûr qu'il
s'applique à SQLite...
--
Une Bévue