Bonjour,

En considérant la table dont voici le DDL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
USE [GIFT_MANAGEMENT]
GO
 
/****** Object:  Table [dbo].[T_SERIAL_SER]    Script Date: 11/08/2012 09:52:29 ******/
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TABLE [dbo].[T_SERIAL_SER](
    [SER_ID] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_T_SERIAL_SER] PRIMARY KEY CLUSTERED 
(
    [SER_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
GO
Est-il correct de faire :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
SELECT TOP 1
        SER_ID AS 'CRD_SERIAL'
FROM
        DBO.T_SERIAL_SER SER
WHERE
        SER_ID > @UNE_VALEUR 
    AND SER_ID NOT IN    (
                        @X,@Y,@Z
                        )
Plutôt que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
SELECT 
        MIN(SER_ID) AS 'CRD_SERIAL'
FROM
        DBO.T_SERIAL_SER SER
WHERE
        SER_ID > @UNE_VALEUR 
    AND SER_ID NOT IN    (
                        @X,@Y,@Z
                        )
Alors je sais qu'il n'y a pas d'ordre dans une table. Que c'est un sac de billes. Mais le fait d'introduire un index cluster n'apporte-t-il pas de l'ordre ?

Je pose cette question car cette petite requête toute simple s'intègre dans en fait dans une plus grande et est le membre de droite d'une clause OUTER APPLY. Le truc est qu'avec le 2e bout de code, je ne vois jamais le bout de la requête... Alors qu'avec le 1e, c'est immédiat ou presque.


Pour info, voici la requête complete :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
    SELECT
            CRD.TCA_ID,
            CRD.CRD_RECHARGEABLE,
            MIN(CRD.CRD_SERIAL) AS 'MIN',
            MAX(CRD.CRD_SERIAL) AS 'MAX'
    FROM
            DBO.T_GIFT_COMMANDE_GFC GFC
                INNER JOIN dbo.T_CARD_CRD CRD
                    ON    GFC.GFT_ID = CRD.GFT_ID 
                OUTER APPLY    (
                            SELECT TOP 1
                                    SER_ID AS 'CRD_SERIAL'
                            FROM
                                    DBO.T_SERIAL_SER SER
                            WHERE
                                    SER_ID > CRD.CRD_SERIAL 
                                AND SER_ID NOT IN    (
                                                    SELECT
                                                            CRD_SERIAL
                                                    FROM
                                                            DBO.T_GIFT_COMMANDE_GFC GFC2
                                                                INNER JOIN dbo.T_CARD_CRD CRD3
                                                                    ON    GFC2.GFT_ID = CRD3.GFT_ID 
                                                    WHERE
                                                            CRD3.TCA_ID = CRD.TCA_ID 
                                                        AND GFC2.CMD_ID = @CMD_ID
                                                    )
                            ) T
    WHERE
            GFC.CMD_ID = @CMD_ID 
    GROUP BY
            CRD.TCA_ID,
            CRD.CRD_RECHARGEABLE,
            T.CRD_SERIAL
    ORDER BY
            CRD.TCA_ID,
            CRD.CRD_RECHARGEABLE,
            [MIN]