2 votes

Déclarez une variable avec la déclaration SQL SELECT à utiliser dans la clause WHERE

J'ai une très longue déclaration SQL qui a le squelette suivant (utilisant SQL Server 2005) :

SELECT
    a.something AS Something,
    b.otherthing AS Otherthing,
    (SELECT another FROM ... WHERE...) AS Importantvariable,
....
FROM...
INNER JOIN...
INNER JOIN...
WHERE a.columnname = (SELECT another FROM ... WHERE...) ....

Cet Importantvariable est une requête très longue en soi. Cependant, il est utilisé dans d'autres parties de la même requête, y compris la clause WHERE et les clauses INNER JOIN. Ma question est, comment puis-je sauvegarder sa valeur pour ne pas avoir à écrire la requête complète à chaque fois. Dans cet exemple ci-dessus, je voudrais taper a.columnname = Importantvariable au lieu de toute la requête. J'ai essayé d'utiliser DECLARE et de sauvegarder la valeur dans une variable déclarée mais cela ne me le permet pas avec l'erreur suivante :

Une déclaration SELECT qui attribue une valeur à une variable ne doit pas être combinée avec une opération de récupération de données.

Évidemment, cela a du sens mais mon objectif est de réaliser une récupération de données, je ne veux simplement pas copier et coller la très longue requête qui définit le Importantvariable à plusieurs endroits différents dans la requête. Des idées ?

3voto

Shnugo Points 45894

Vous pouvez utiliser APPLY pour créer quelque chose comme une variable nommée ligne par ligne. Si la valeur est calculée une fois et est valide pour l'ensemble (plus comme une constante), vous pourriez utiliser un CTE (commençant par WITH avant le SELECT).

Le code suivant utilisera un APPLY pour trouver le nom de la table pour toutes les colonnes. Vous pouvez utiliser The.ImportantVariable dans la liste des colonnes ainsi que dans une clause WHERE:

SELECT The.ImportantVariable
      ,c.*
FROM sys.columns AS c
OUTER APPLY(SELECT name FROM sys.objects AS o WHERE c.object_id=o.object_id) AS The(ImportantVariable)
WHERE The.ImportantVariable LIKE 'a%';

COMPARER CTE et APPLY

Vérifiez ceci! Il y a des valeurs constantes dans 1 seule ligne fournies par le CTE que vous pouvez CROSS JOIN dans votre requête et utiliser comme constantes nommées

WITH SomeConstants AS
(
    SELECT 'Je suis une valeur constante' AS Constant1 -- pourrait être une déclaration complexe aussi!
           ,0 AS Constant2
)
SELECT The.ImportantVariable
      ,Constant1
      ,Constant2
      ,c.*
FROM SomeConstants
CROSS JOIN sys.columns AS c
OUTER APPLY(SELECT name FROM sys.objects AS o WHERE c.object_id=o.object_id) AS The(ImportantVariable)
WHERE The.ImportantVariable LIKE 'a%'

0voto

Mike Nakis Points 7259

Ce que vous recherchez, ce sont les Expressions de Table Courantes (CTE) de Microsoft SQL Server

Vous pouvez en lire davantage ici : https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx

Ce que vous devez faire est le suivant :

WITH (colonnes)
AS (requête)
SELECT (une autre requête utilisant (possiblement plusieurs fois) la requête précédente)

0voto

Matt Points 629

Il semble que vous recherchiez une VUE. Une vue est essentiellement une instruction SQL stockée qui peut être appelée comme un nom de table.

SELECT * FROM nom_de_la_vue ... WHERE ...

Une vue contient souvent un certain nombre de jointures et de colonnes avec des alias, ce qui vous permet de créer des objets virtuels sans dupliquer les données sur plusieurs tables SQL.

Consultez votre documentation pour plus de détails, mais voici un lien vers des exemples de W3schools https://www.w3schools.com/sql/sql_view.asp

0voto

Peter Points 786

Utilisez un outer ou un cross apply. Cela rend votre requête plus lisible et probablement plus rapide également.

SELECT
    a.something AS Something,
    b.otherthing AS Otherthing,
    Importantvariable,
....
FROM...
INNER JOIN...
INNER JOIN...
outer apply (SELECT another AS Importantvariable FROM ... WHERE...)
WHERE a.columnname = Importantvariable ....

0voto

IngoB Points 1046

Je recommande d'utiliser un CTE comme ceci :

;with cte as
(
SELECT
    a.something AS Something,
    b.otherthing AS Otherthing,
    (SELECT another FROM ... WHERE...) AS Importantvariable,
....
FROM...
INNER JOIN...
INNER JOIN...
)
select *,

  from cte
 WHERE columnname = Importantvariable;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X