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

aide pour une commande sql

4 réponses
Avatar
Eric Hourant
Bonjour,
Je sèche actuellement sur une commande (ms-)sql qui me paraissait simple. Si
quelqu'un peut m'aider.

J'utilise 2 tables :
- une table entête
- une table détail : pour chaque enregistrement d'entête, je peux avoir de 0
à n enregistrements de détails

Jusque là, pas de quoi fouetter un chat.

Je souhaite une commande qui me récupère toutes les lignes d'entêtes et le
PREMIER enregistrement de détail. Si il n'y a pas de détail, je veux quand
même les données d'entête.

Donc, le résultat doit ramener autant de lignes que d'enregistrements
d'entête.

Merci d'avance,


Eric

4 réponses

Avatar
Fred BROUARD
Bonjour,

Eric Hourant a écrit:
Bonjour,
Je sèche actuellement sur une commande (ms-)sql qui me paraissait simple. Si
quelqu'un peut m'aider.



Un ordre SQL SELECT suffit


J'utilise 2 tables :
- une table entête
- une table détail : pour chaque enregistrement d'entête, je peux avoir de 0
à n enregistrements de détails



La notion d'"enregistrement" n'existe pas dans les SGBDR. On parle de lignes.


Jusque là, pas de quoi fouetter un chat.

Je souhaite une commande qui me récupère toutes les lignes d'entêtes et le
PREMIER enregistrement de détail. Si il n'y a pas de détail, je veux quand
même les données d'entête.

Donc, le résultat doit ramener autant de lignes que d'enregistrements
d'entête.



Vous n'avez pas indiqué le modèle des données....

CREATE TABLE T_MAITRE_MTR
(MTR_ID INTEGER NOT NULL PRIMARY KEY,
MTR_INFO VARCHAR(16))
GO

CREATE TABLE T_DETAIL_DTL
(DTL_ID INTEGER NOT NULL PRIMARY KEY,
MTR_ID INTEGER FOREIGN KEY REFERENCES T_MAITRE_MTR (MTR_ID),
DTL_LIBELLE VARCHAR(16))
GO

INSERT INTO T_MAITRE_MTR VALUES (1, 'Paul')
INSERT INTO T_MAITRE_MTR VALUES (2, 'Jacques')
INSERT INTO T_MAITRE_MTR VALUES (4, 'Pierre')
INSERT INTO T_MAITRE_MTR VALUES (7, 'Jean')
GO

INSERT INTO T_DETAIL_DTL VALUES (101, 7, 'Armoire')
INSERT INTO T_DETAIL_DTL VALUES (102, 7, 'Buffet')
INSERT INTO T_DETAIL_DTL VALUES (105, 7, 'Canapé')
INSERT INTO T_DETAIL_DTL VALUES (104, 4, 'Lit')
INSERT INTO T_DETAIL_DTL VALUES (103, 1, 'Table')
INSERT INTO T_DETAIL_DTL VALUES (108, 1, 'Chaise')
GO

SELECT *
FROM T_MAITRE_MTR M
LEFT OUTER JOIN T_DETAIL_DTL D
ON M.MTR_ID = D.MTR_ID
WHERE DTL_ID = (SELECT MAX(DTL_ID)
FROM T_DETAIL_DTL
WHERE MTR_ID = M.MTR_ID)
OR DTL_ID IS NULL
GO

MTR_ID MTR_INFO DTL_ID MTR_ID DTL_LIBELLE
----------- ---------------- ----------- ----------- ----------------
1 Paul 108 1 Chaise
2 Jacques NULL NULL NULL
4 Pierre 104 4 Lit
7 Jean 105 7 Canapé

Vous pouvez remplacer MAX par MIN dans la sous requête...

Pour comprende le SQL :
1) mon site SQLpro : http://sqlpro.developpez.com/
2) mes bouquins : SQL développement, SQL Synthex !

A +



Merci d'avance,


Eric





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Philippe T [MS]
Bonjour,

DECLARE @TABLE_A TABLE(ID_A int, CODE_A nvarchar(100))
DECLARE @TABLE_B TABLE(ID_B int, ID_A int, CODE_B nvarchar(100))

INSERT INTO @TABLE_A(ID_A, CODE_A) VALUES(1, 'A')
INSERT INTO @TABLE_A(ID_A, CODE_A) VALUES(2, 'B')
INSERT INTO @TABLE_A(ID_A, CODE_A) VALUES(3, 'C')

INSERT INTO @TABLE_B(ID_B, ID_A, CODE_B) VALUES(1, 1, 'A1')
INSERT INTO @TABLE_B(ID_B, ID_A, CODE_B) VALUES(2, 1, 'A2')
INSERT INTO @TABLE_B(ID_B, ID_A, CODE_B) VALUES(3, 2, 'B1')
INSERT INTO @TABLE_B(ID_B, ID_A, CODE_B) VALUES(4, 2, 'B2')
INSERT INTO @TABLE_B(ID_B, ID_A, CODE_B) VALUES(5, 2, 'B3')

SELECT a.ID_A, a.CODE_A, b.CODE_B
FROM @TABLE_A a
LEFT JOIN @TABLE_B b ON a.ID_A = b.ID_A
LEFT JOIN (SELECT DISTINCT ID_A, MIN(ID_B) AS ID_B FROM @TABLE_B GROUP BY
ID_A) z ON b.ID_A = z.ID_A AND b.ID_B = z.ID_B

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"Eric Hourant" wrote in message
news:43acfe41$0$2144$
Bonjour,
Je sèche actuellement sur une commande (ms-)sql qui me paraissait simple.
Si quelqu'un peut m'aider.

J'utilise 2 tables :
- une table entête
- une table détail : pour chaque enregistrement d'entête, je peux avoir de
0 à n enregistrements de détails

Jusque là, pas de quoi fouetter un chat.

Je souhaite une commande qui me récupère toutes les lignes d'entêtes et le
PREMIER enregistrement de détail. Si il n'y a pas de détail, je veux quand
même les données d'entête.

Donc, le résultat doit ramener autant de lignes que d'enregistrements
d'entête.

Merci d'avance,


Eric




Avatar
Philippe T [MS]
Bonjour,

Fred, tu m'a devancé d'une petite minute :-)

----------------------------------------------------------------------
Philippe TROTIN - Microsoft Service France

"Fred BROUARD" wrote in message
news:
Bonjour,

Eric Hourant a écrit:
Bonjour,
Je sèche actuellement sur une commande (ms-)sql qui me paraissait simple.
Si quelqu'un peut m'aider.



Un ordre SQL SELECT suffit


J'utilise 2 tables :
- une table entête
- une table détail : pour chaque enregistrement d'entête, je peux avoir
de 0 à n enregistrements de détails



La notion d'"enregistrement" n'existe pas dans les SGBDR. On parle de
lignes.


Jusque là, pas de quoi fouetter un chat.

Je souhaite une commande qui me récupère toutes les lignes d'entêtes et
le PREMIER enregistrement de détail. Si il n'y a pas de détail, je veux
quand même les données d'entête.

Donc, le résultat doit ramener autant de lignes que d'enregistrements
d'entête.



Vous n'avez pas indiqué le modèle des données....

CREATE TABLE T_MAITRE_MTR
(MTR_ID INTEGER NOT NULL PRIMARY KEY,
MTR_INFO VARCHAR(16))
GO

CREATE TABLE T_DETAIL_DTL
(DTL_ID INTEGER NOT NULL PRIMARY KEY,
MTR_ID INTEGER FOREIGN KEY REFERENCES T_MAITRE_MTR (MTR_ID),
DTL_LIBELLE VARCHAR(16))
GO

INSERT INTO T_MAITRE_MTR VALUES (1, 'Paul')
INSERT INTO T_MAITRE_MTR VALUES (2, 'Jacques')
INSERT INTO T_MAITRE_MTR VALUES (4, 'Pierre')
INSERT INTO T_MAITRE_MTR VALUES (7, 'Jean')
GO

INSERT INTO T_DETAIL_DTL VALUES (101, 7, 'Armoire')
INSERT INTO T_DETAIL_DTL VALUES (102, 7, 'Buffet')
INSERT INTO T_DETAIL_DTL VALUES (105, 7, 'Canapé')
INSERT INTO T_DETAIL_DTL VALUES (104, 4, 'Lit')
INSERT INTO T_DETAIL_DTL VALUES (103, 1, 'Table')
INSERT INTO T_DETAIL_DTL VALUES (108, 1, 'Chaise')
GO

SELECT *
FROM T_MAITRE_MTR M
LEFT OUTER JOIN T_DETAIL_DTL D
ON M.MTR_ID = D.MTR_ID
WHERE DTL_ID = (SELECT MAX(DTL_ID)
FROM T_DETAIL_DTL
WHERE MTR_ID = M.MTR_ID)
OR DTL_ID IS NULL
GO

MTR_ID MTR_INFO DTL_ID MTR_ID DTL_LIBELLE
----------- ---------------- ----------- ----------- ----------------
1 Paul 108 1 Chaise
2 Jacques NULL NULL NULL
4 Pierre 104 4 Lit
7 Jean 105 7 Canapé

Vous pouvez remplacer MAX par MIN dans la sous requête...

Pour comprende le SQL :
1) mon site SQLpro : http://sqlpro.developpez.com/
2) mes bouquins : SQL développement, SQL Synthex !

A +



Merci d'avance,


Eric





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************



Avatar
Eric Hourant
Fred (et Philippe),
Tous mes remerciements pour votre prompte réponse. C'est exactement ce qu'il
me fallait.

La notion d'"enregistrement" n'existe pas dans les SGBDR. On parle de
lignes.<<




Ben oui, les "vieilles" habitudes reviennent toujours...

Pour comprende le SQL : 1) mon site SQLpro : http://sqlpro.developpez.com/


De fait, il est en première position des preférences de mon IE. Merci
également pour ton sens didactique et tes exemples bien choisis.

Bon(s) réveillon(s) à tous.

Eric


"Fred BROUARD" a écrit dans le message de news:

Bonjour,

Eric Hourant a écrit:
Bonjour,
Je sèche actuellement sur une commande (ms-)sql qui me paraissait simple.
Si quelqu'un peut m'aider.



Un ordre SQL SELECT suffit


J'utilise 2 tables :
- une table entête
- une table détail : pour chaque enregistrement d'entête, je peux avoir
de 0 à n enregistrements de détails



La notion d'"enregistrement" n'existe pas dans les SGBDR. On parle de
lignes.


Jusque là, pas de quoi fouetter un chat.

Je souhaite une commande qui me récupère toutes les lignes d'entêtes et
le PREMIER enregistrement de détail. Si il n'y a pas de détail, je veux
quand même les données d'entête.

Donc, le résultat doit ramener autant de lignes que d'enregistrements
d'entête.



Vous n'avez pas indiqué le modèle des données....

CREATE TABLE T_MAITRE_MTR
(MTR_ID INTEGER NOT NULL PRIMARY KEY,
MTR_INFO VARCHAR(16))
GO

CREATE TABLE T_DETAIL_DTL
(DTL_ID INTEGER NOT NULL PRIMARY KEY,
MTR_ID INTEGER FOREIGN KEY REFERENCES T_MAITRE_MTR (MTR_ID),
DTL_LIBELLE VARCHAR(16))
GO

INSERT INTO T_MAITRE_MTR VALUES (1, 'Paul')
INSERT INTO T_MAITRE_MTR VALUES (2, 'Jacques')
INSERT INTO T_MAITRE_MTR VALUES (4, 'Pierre')
INSERT INTO T_MAITRE_MTR VALUES (7, 'Jean')
GO

INSERT INTO T_DETAIL_DTL VALUES (101, 7, 'Armoire')
INSERT INTO T_DETAIL_DTL VALUES (102, 7, 'Buffet')
INSERT INTO T_DETAIL_DTL VALUES (105, 7, 'Canapé')
INSERT INTO T_DETAIL_DTL VALUES (104, 4, 'Lit')
INSERT INTO T_DETAIL_DTL VALUES (103, 1, 'Table')
INSERT INTO T_DETAIL_DTL VALUES (108, 1, 'Chaise')
GO

SELECT *
FROM T_MAITRE_MTR M
LEFT OUTER JOIN T_DETAIL_DTL D
ON M.MTR_ID = D.MTR_ID
WHERE DTL_ID = (SELECT MAX(DTL_ID)
FROM T_DETAIL_DTL
WHERE MTR_ID = M.MTR_ID)
OR DTL_ID IS NULL
GO

MTR_ID MTR_INFO DTL_ID MTR_ID DTL_LIBELLE
----------- ---------------- ----------- ----------- ----------------
1 Paul 108 1 Chaise
2 Jacques NULL NULL NULL
4 Pierre 104 4 Lit
7 Jean 105 7 Canapé

Vous pouvez remplacer MAX par MIN dans la sous requête...

Pour comprende le SQL :
1) mon site SQLpro : http://sqlpro.developpez.com/
2) mes bouquins : SQL développement, SQL Synthex !

A +



Merci d'avance,


Eric





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************