OVH Cloud OVH Cloud

Insert Select

11 réponses
Avatar
ADB
Bonjour,
Est-il possible de regrouper ces 2 requêtes en une seule, et comment ?

INSERT INTO wa_abo_liste (abo_id) SELECT wa_abonnes.abo_id FROM wa_abonnes
INSERT INTO wa_abo_liste (liste_id, format) VALUES (1,2)

Merci
ADB

10 réponses

1 2
Avatar
Fred BROUARD - SQLpro
INSERT INTO wa_abo_liste (abo_id, liste_id, format)
SELECT wa_abonnes.abo_id, NULL, NULL
FROM wa_abonnes
UNION
SELECT NULL, 1, 2
FROM wa_abonnes
WHERE abo_id = (SELECT MAX(abo_id) FROM wa_abonnes)


Par exemple


ADB a écrit:
Bonjour,
Est-il possible de regrouper ces 2 requêtes en une seule, et comment ?

INSERT INTO wa_abo_liste (abo_id) SELECT wa_abonnes.abo_id FROM wa_abonnes
INSERT INTO wa_abo_liste (liste_id, format) VALUES (1,2)

Merci
ADB



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
yves
Pour avoir déjà pratiquer des UNION,
j'ai peur que le résultat du SELECT ... UNION SELECT .... va donner

abo_id NULL NULL
NULL 1 2

et donc que l' INSERT ne marchera pas.

Non ?

Cdlt,

Fred BROUARD - SQLpro wrote:
INSERT INTO wa_abo_liste (abo_id, liste_id, format)
SELECT wa_abonnes.abo_id, NULL, NULL
FROM wa_abonnes
UNION
SELECT NULL, 1, 2
FROM wa_abonnes
WHERE abo_id = (SELECT MAX(abo_id) FROM wa_abonnes)


Par exemple


ADB a écrit:
Bonjour,
Est-il possible de regrouper ces 2 requêtes en une seule, et comment
?

INSERT INTO wa_abo_liste (abo_id) SELECT wa_abonnes.abo_id FROM
wa_abonnes INSERT INTO wa_abo_liste (liste_id, format) VALUES (1,2)

Merci
ADB
Avatar
Fred BROUARD - SQLpro
as tu essayé ?

Qu'est ce qui t'éffraie ?

C'est bien ce que tu voulais non ???

A +

yves a écrit:
Pour avoir déjà pratiquer des UNION,
j'ai peur que le résultat du SELECT ... UNION SELECT .... va donner

abo_id NULL NULL
NULL 1 2

et donc que l' INSERT ne marchera pas.

Non ?

Cdlt,

Fred BROUARD - SQLpro wrote:

INSERT INTO wa_abo_liste (abo_id, liste_id, format)
SELECT wa_abonnes.abo_id, NULL, NULL
FROM wa_abonnes
UNION
SELECT NULL, 1, 2
FROM wa_abonnes
WHERE abo_id = (SELECT MAX(abo_id) FROM wa_abonnes)


Par exemple


ADB a écrit:

Bonjour,
Est-il possible de regrouper ces 2 requêtes en une seule, et comment
?

INSERT INTO wa_abo_liste (abo_id) SELECT wa_abonnes.abo_id FROM
wa_abonnes INSERT INTO wa_abo_liste (liste_id, format) VALUES (1,2)

Merci
ADB










--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Igor Racic
ADB wrote:
Bonjour,
Est-il possible de regrouper ces 2 requêtes en une seule, et comment ?

INSERT INTO wa_abo_liste (abo_id) SELECT wa_abonnes.abo_id FROM wa_abonnes
INSERT INTO wa_abo_liste (liste_id, format) VALUES (1,2)

Merci
ADB




Quel peut être le raison de le faire ?
Diminuer le aller-retour entre la base et le client ou c'est la question
theorétique ?

Je ne vois pas beaucoup d'intêrets de le faire...

Igor
Avatar
ADB
Les regrouper parce que
- les 1re données viennent d'une autre table et vont remplir abo_liste
- ensuite, les champs de abo_liste ne seront pas remplis
Donc je voudrais que le champ abo_id se remplisse ET que les champs
liste_id et format remplissent également toutes les lignes remplies par
la 1re opération.
Merci
ADB
Avatar
Igor Racic
ADB wrote:
Les regrouper parce que
- les 1re données viennent d'une autre table et vont remplir abo_liste
- ensuite, les champs de abo_liste ne seront pas remplis
Donc je voudrais que le champ abo_id se remplisse ET que les champs
liste_id et format remplissent également toutes les lignes remplies par
la 1re opération.
Merci
ADB




<quote>
INSERT INTO wa_abo_liste (abo_id) SELECT wa_abonnes.abo_id FROM wa_abonnes
INSERT INTO wa_abo_liste (liste_id, format) VALUES (1,2)
<quote>

Si j'ai bien compris (mais je ne suis pas très sûre) tu veux initiaiser
ler deux autres champs à la fois dans la MEME LIGNE:

insert into wa_abo_liste (abo_id, liste_id, format) select
wa_abonnes.abo_id, 1, 2 from wa_abonnes

OU

Tu veux toujours deux lignes qu'on toujours abo_id bien remplie.
Dans ce cas il tu peux le faire (dans Oracle) avec une sequence et un
trigger

Si non, comment les données doivent être à la fin ?

Igor
Avatar
ADB
Merci de t'intéresser à mon pb.
J'explique mieux:
J'ai une liste d'email dans une table X (peu importe).
Ces email vont aller remplir le champ abo_email de la table abonnes (le
champ abo_id s'auto-incremente).
De cette table abonnes, je veux remplir la table abo_liste de sorte que
abo_id de abonnes et abo_id de abo_liste se correspondent.
Mais en plus, je veux que les champs liste_id et format de abo_liste se
remplissent.

En fait, tout ce Insert vient après un autre Insert sur la table X, qui
se trouve dans une autre base.
ADB

Igor Racic wrote:
ADB wrote:

Les regrouper parce que
- les 1re données viennent d'une autre table et vont remplir abo_liste
- ensuite, les champs de abo_liste ne seront pas remplis
Donc je voudrais que le champ abo_id se remplisse ET que les champs
liste_id et format remplissent également toutes les lignes remplies
par la 1re opération.
Merci
ADB




<quote>
INSERT INTO wa_abo_liste (abo_id) SELECT wa_abonnes.abo_id FROM wa_abonnes
INSERT INTO wa_abo_liste (liste_id, format) VALUES (1,2)
<quote>

Si j'ai bien compris (mais je ne suis pas très sûre) tu veux initiaiser
ler deux autres champs à la fois dans la MEME LIGNE:

insert into wa_abo_liste (abo_id, liste_id, format) select
wa_abonnes.abo_id, 1, 2 from wa_abonnes

OU

Tu veux toujours deux lignes qu'on toujours abo_id bien remplie.
Dans ce cas il tu peux le faire (dans Oracle) avec une sequence et un
trigger

Si non, comment les données doivent être à la fin ?

Igor
Avatar
Igor Racic
ADB wrote:
Merci de t'intéresser à mon pb.
J'explique mieux:
J'ai une liste d'email dans une table X (peu importe).
Ces email vont aller remplir le champ abo_email de la table abonnes (le
champ abo_id s'auto-incremente).
De cette table abonnes, je veux remplir la table abo_liste de sorte que
abo_id de abonnes et abo_id de abo_liste se correspondent.
Mais en plus, je veux que les champs liste_id et format de abo_liste se
remplissent.

En fait, tout ce Insert vient après un autre Insert sur la table X, qui
se trouve dans une autre base.
ADB




Alors, it te faut un "POST INSERT" trigger dans la table X
(qui pour chaque lignes va inserer dans la table abonnes ).

Et soit le même trigger vas inserer dans abo_liste soit un "POST INSERT"
trigger dans table abonnes vas inserer dans abo_liste.
Le choix depend de question d'où viens l'info pour "que les champs
liste_id et format de abo_liste se remplissent".

Si sont les constants 1,2 comme dans ta 1er question alors trigger dans
X peux faire les choses complétement. Si par contre l'info viens de
table abonnes c'est 2èmme triger qui est egalement necessaire.

Alors, donne un example bien prècis pour une réponse plus précis.

Aussi, il me semble d'avoir besoin de vérifier le model de données
(est-ce que l'info redundant dans les deux tables est bien justifié)

Igor
Avatar
ADB
Le pb s'est décalé -)
Car j'ai rempli les tables directement depuois phpmyadmin.
Mais maintenant se pose le pb de l'insertion ou update à chaque nouvelle
entrée (la 1re fois, c'était pour passer tout d'un seul coup,
maintenant, c'est lors de l'enreg d'un nouveau meail ou un update
d'email). Désolé, mais je progresse dans l'action.

Le code suivant doit me permettre d'insérer un enregistrement s'il
n'existait pas auparavant, ou de mettre à jour la table si
l'enregistrement correspondant existait.
J'ai donc cela:

include("database2.php3"); // Fonctions d"accès à la base de données

$id_connex2=ouvrir_base2();
$requete="SELECT * FROM wa_abonnes WHERE abo_email='$email' ";
echo"<br><br><br>$requete";
//envoi de la requête
$id_result=mysql_query($requete, $id_connex2);

if(!$id_result)
{
$date=time();
$req1="update a1.wa_abonnes set abo_email='$email',
abo_register_date='$date' ";
echo"<br><br><br>$req1<br>";
$req2="update a1.wa_abo_liste set abo_id=wa_abonnes.abo_id,
liste_id='1', format='2' ";
echo"$req2";
}
else {
$date=time();
$req1="insert into a1.wa_abonnes set abo_email='$email',
abo_register_date='$date' ";
$id_result=mysql_query($req1, $id_connex2);
echo"<br><br><br>$req1<br>";
$req2="SELECT * FROM wa_abonnes WHERE abo_email='$email' ";
$id_resultx=mysql_query($req2, $id_connex2);
while($table mysql_fetch_array($id_resultx, MYSQL_ASSOC))
{
$req3="insert into a1.wa_abo_liste set abo_id='$table[abo_id]',
liste_id='1', format='2' ";
echo"$req2<br>$req3";
}
}

Actuellement, l'enregistrement n'existe pas et je fais bien un premier
insert dans a1.wa_abonnes.
En revanche, je n'ai pas d'insert dans a1.wa_abo_liste
Je ne comprends pas pourquoi.
Merci de bien vouloir m'éclairer.
ADB

Igor Racic wrote:

ADB wrote:


Alors, it te faut un "POST INSERT" trigger dans la table X
(qui pour chaque lignes va inserer dans la table abonnes ).

Et soit le même trigger vas inserer dans abo_liste soit un "POST INSERT"
trigger dans table abonnes vas inserer dans abo_liste.
Le choix depend de question d'où viens l'info pour "que les champs
liste_id et format de abo_liste se remplissent".

Si sont les constants 1,2 comme dans ta 1er question alors trigger dans
X peux faire les choses complétement. Si par contre l'info viens de
table abonnes c'est 2èmme triger qui est egalement necessaire.

Alors, donne un example bien prècis pour une réponse plus précis.

Aussi, il me semble d'avoir besoin de vérifier le model de données
(est-ce que l'info redundant dans les deux tables est bien justifié)

Igor
Avatar
Igor Racic
Je ne me sens pas très bien avec mySQL et PHP.
Désolé

Igor


ADB wrote:
Le pb s'est décalé -)
Car j'ai rempli les tables directement depuois phpmyadmin.
1 2