J'ai deux questions combinées à un p> Les deux, bien sûr, fonctionnent bien séparément, mais lorsqu'il est combiné avec un «code> union code>: p> La requête échoue avec l'erreur: p> msg 104, niveau 15, état 1, ligne 3 Comment puis-je utiliser une commande par une déclaration avec un syndicat tout? p> serveur: msg 104, niveau 15, état 1, ligne 2 Union tout code> 1 sup>:
La commande par les éléments doit apparaître dans la liste Sélectionner si l'instruction contient un opérateur syndical. P>
blockQuote> Exemple-pâte-pâte h2>
La commande par les éléments doit apparaître dans la liste Sélectionner si l'instruction contient un opérateur syndical. P>
blockQuote> Notes de bas de page h2>
Voir aussi h2>
4 Réponses :
Je sais que vous pouvez utiliser un CTE (expression de table commune), où vous pouvez utiliser votre commande par la CTE.
;with results as
(
SELECT Cassettes.CassetteNumber,
LastCassetteTransfers.Amount,
CassetteTransfers.CreatedDate
FROM Cassettes
INNER JOIN LastCassetteTransfers
ON Cassettes.CassetteGUID = LastCassetteTransfers.CassetteGUID
UNION ALL
SELECT Cassettes.CassetteNumber,
(
SELECT TOP 1 CassetteTransfers.Amount
FROM CassetteTransfers
WHERE CassetteTransfers.CassetteGUID = Cassettes.CassetteGUID
AND CassetteTransfers.Mode = 'ctmLoad'
) AS Amount,
CassetteTransfers.CreatedDate
FROM Cassettes
)
SELECT CassetNumber, Amount
FROM results
ORDER BY CassetteTransfers.CreatedDate DESC, CassetteTransfers.Amount
Il est sur SQL 2000. Aucun support CTE.
Un peu de hack, mais cela fonctionnera.
CREATE TABLE Friends (Flavor int, Color int)
CREATE TABLE Strangers (Flavor int, StrangerID int)
CREATE TABLE Rainbows (StrangerID int, Color int, Wavelength int)
go
SELECT Flavor, Color
FROM Friends
UNION ALL
SELECT Flavor,
(SELECT Color FROM
(SELECT TOP 1 Color, Wavelength
FROM Rainbows
WHERE Rainbows.StrangerID = Strangers.StrangerID
ORDER BY Wavelength DESC
) AS Foo
) AS Color
FROM Strangers
go
DROP TABLE Rainbows
DROP TABLE Strangers
DROP TABLE Friends
En réalité, en regardant la solution de contournement de ce lien que j'ai commenté, vous voudrez peut-être essayer ceci: ... ou un type similaire de chose à essayer de tromper le moteur à ne pas Se plaindre. P> Mais je ne peux pas le tester, j'ai peur; Je ne pense pas que nous avons une boîte de 2000 à gauche dans le bâtiment, virtuelle ou autrement. P> EDIT: AH! Ressemble à Joe et j'ai chevauché sur notre snapisme :) p> p>
Je suggère de créer une table variable dans le format des colonnes que vous souhaitez.
Exemple: P>
set nocount on
DECLARE @temp_table TABLE(Flavor varchar(20), Color varchar(20))
insert into @temp_table (Flavor,Color)
/*Apply select query #1 with all filters, joins and sorting */
SELECT Flavor,Color FROM Strangers ORDER BY Wavelength DESC
insert into @temp_table (Flavor,Color)
/*Apply select query #2 with all filters, joins and sorting */
SELECT Flavor, Color FROM Friends
/*Return the results pushed into @variable table */
select * from @temp_table
Votre exemple fonctionne pour moi dans SQL Server 2005 Même si je définis la base de données sur le mode de compatibilité SQL2000.
Regarde bien pour moi. Je me demande s'il y avait une restriction ou un bug étrange dans SQL Server 2000? Je ne me souviens pas, mais bon, ça fait presque une décennie ...
Il y a d'autres moyens d'écrire cette requête. Essayez-vous simplement de résoudre ce problème spécifique ou ne voulez-vous que des solutions qui vous permettent d'utiliser la sous-requête?
@Martin: Je peux dupliquer le problème sur une nouvelle instance SQL 2000.
@Tom H. Je suis parfaitement prêt à laisser quelqu'un d'autre faire le travail et réécrire la requête. Gardez à l'esprit que la vraie requête qui a déclenché cette question est beaucoup plus compliquée - ce qui le rend beaucoup plus difficile à convertir. Réécriture certainement la requête sera une réponse élueillonnée que d'autres personnes ayant le même problème pourraient être capables de le faire (et peut-être pouvons-nous également utiliser). Mais il semble que la réponse valide va avoir à dire: " Ceci est un bogue dans l'optimiseur de SQL Server 2000, qui a été corrigé en 2005. Et votre seul moyen de le contourner est de ré-écrire la requête. i> ".
En fait, mettez cette déclaration exacte, avec votre ré-écriture et vous avez une réponse acceptée.
On dirait que vous êtes peut-être en cours d'exécution: Connect.Microsoft.com/sqlserver/feedback/Détails/421924/... <- Développez les détails. Ce n'est pas beaucoup d'aide, je ne pense pas, mais cela peut au moins confirmer que c'est un bogue avec 2000 que MS n'a jamais été corrigé, alors les patchs et les packs de services ne vont pas aider.