J'ai une requête SQL (T-SQL) dans laquelle j'ai une sous-requête dans l' SELECT
instruction.
Voici une version réduite:
SELECT
p.id AS id,
(SELECT
jobs_without_price.id
FROM
st_job jobs_without_price
WHERE
jobs_without_price.person_id = p.id
AND
jobs_without_price.price IS NULL
FOR XML AUTO, ROOT('jobs')) AS JobsWithoutPrice
FROM
st_person p
WHERE
JobsWithoutPrice IS NOT NULL
GROUP BY
p.id
Le problème est que SSMS me dit
Nom de colonne non valide "JobsWithoutPrice".
C'est presque certainement parce que SQL n'autorise pas les alias dans les WHERE
clauses, mais comment puis-je utiliser le résultat de cette sous-requête pour filtrer les résultats?
[La requête complète a plus de jointures de table et bien plus dans l' SELECT
instruction, qui se rapportent toutes à un seul enregistrement de personne , alors que la sous-requête renvoie plusieurs enregistrements, c'est pourquoi elle se trouve dans une sous-requête.]
Vous devriez pouvoir le faire en déplaçant simplement l' opérateur sub-query
in CROSS APPLY
. Quelque chose comme ça:
SELECT
p.id AS id
,newXML
FROM
st_person p
CROSS APPLY
(
SELECT
jobs_without_price.id AS JobsWithoutPrice
FROM
st_job jobs_without_price
WHERE
jobs_without_price.person_id = p.id
AND
jobs_without_price.price IS NULL
FOR XML AUTO, ROOT('jobs')
) AS DS (newXML)
--WHERE
-- newXML IS NOT NULL
GROUP BY
p.id;
Notez que j'ai commenté le dernier WHERE
article. Nous devrions en avoir besoin, tout comme CROSS APPLY
renvoyer les lignes de la partie gauche qui correspondent à une ou plusieurs lignes dans la partie droite (comme INNER JOIN
). Vous pouvez essayer OUTER APPLY
d'obtenir toutes les lignes de la partie gauche de l'opérateur (comme LEFT JOIN
).
Vous êtes autorisé à utiliser les colonnes retournées par l' APPLY
opérateur dans chaque article ( SELECT
, JOIN
, WHERE
, ORDER BY
, HAVING
, GROUP BY
).
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots