Requète SQL : spécifique SQL Server ou standard selon vous ?

Requète SQL : spécifique SQL Server ou standard selon vous ? - SQL/NoSQL - Programmation

Marsh Posté le 01-12-2003 à 14:32:07    

Je vous explique ma situation.
Je cherche à faire une recherche des mêmes colones dans 2 tables différentes, un truc du genre de ce qui suit :


(
select VAL1, VAL2, VAL3,  from TABLE1
UNION
select VAL1, VAL2, VAL3,  from TABLE2
)


Seulement, j'ai besoin de savoir de quelle table est issu chaque enregistrement récupéré. La meilleur solution que j'ai trouvée est de faire :


(
select VAL1, VAL2, VAL3, 'TABLE1' as SOURCE from TABLE2
UNION
select VAL1, VAL2, VAL3, 'TABLE2' as SOURCE from TABLE2
)


Et en dernier lieu, j'ai besoin que les enregistrements soient triés en fonction de leur source, et c'est là que j'ai un doute :
d'après vous, c'est du standard ce qui suit ? (j'ai uniquement pu tester sur SQL Server 2000).


(
select VAL1, VAL2, VAL3, 'TABLE1' as SOURCE from TABLE2
UNION
select VAL1, VAL2, VAL3, 'TABLE2' as SOURCE from TABLE2
) order by DOCUMENT


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 01-12-2003 à 14:32:07   

Reply

Marsh Posté le 01-12-2003 à 14:39:41    

Bof pour Oracle j'ai des doutes ...
 
Sinon tu créés une vue  
=>
create view Mavue
as
select VAL1, VAL2, VAL3, 'TABLE1' as SOURCE from TABLE1
UNION
select VAL1, VAL2, VAL3, 'TABLE2' as SOURCE from TABLE2
 
puis
=>
select * from mavue
order by source


Message édité par vttman2 le 01-12-2003 à 14:40:16
Reply

Marsh Posté le 01-12-2003 à 15:10:44    

L'intéret de la chose, c'est de faire l'opération en une seule requète.
 
EDIT : et de ne pas laisser de trace. On doit pouvoir réaliser ce type d'opération des milliers de fois sur différentes tables, sans générer de vues ou autres.


Message édité par El_gringo le 01-12-2003 à 15:14:47

---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 01-12-2003 à 17:04:47    

à partir du moment où tu utilises un order by, tu génère implicitement une table temporaire, donc pour moi ta réticense à ne pas vouloir créer une vue temporaire dans une transaction ne tient pas.
 
Mais sinon, d'un point de vue purement standard, ta requète est correct. Reste à voir si elle est supportée partout

Reply

Marsh Posté le 05-12-2003 à 23:45:28    

comme El_gringo, je ne vois pas l'intérêt de passer par une vue ou une table temporaire.
 
cette syntaxe est 100% standard, mise à part qu'il ne faut pas utiliser de ( ). Le order by ne peux pas être appliqué à un membre d'un union, donc implicitement le moteur SQL sait que c'est pour l'ensemble de la requête.

Reply

Marsh Posté le 09-12-2003 à 14:19:08    

MagicBuzz a écrit :

comme El_gringo, je ne vois pas l'intérêt de passer par une vue ou une table temporaire.
 
cette syntaxe est 100% standard, mise à part qu'il ne faut pas utiliser de ( ). Le order by ne peux pas être appliqué à un membre d'un union, donc implicitement le moteur SQL sait que c'est pour l'ensemble de la requête.


 
Ce qui expliquerait mes nouveaux problèmes!
J'aurais besoin d'nue requète comme ceci:


(SELECT     TOP 5 'TABLE1' AS __SOURCE__, val1, val2, val3, val4, val5, val6, val7, val8, val9, val10, val11, val12
FROM         TABLE1
ORDER BY val1, val2, val3
UNION
SELECT     TOP 5 'TABLE2' AS __SOURCE__, VAL1, VAL2, VAL3, VAL4, VAL5, VAL6, VAL7, VAL8, VAL9, VAL10, VAL11, VAL12
FROM         TABLE2
ORDER BY val1, val2, val3
) ORDER BY __SOURCE__


 
Mais si tu dis qu'on n'peux pas appliquer de ORDER BY aux membres d'un UNION, c normal que ça passe pas. Du coup qqn voit une solution a cet inextriquable problème !?


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 09-12-2003 à 14:29:42    

El_gringo a écrit :


 
Ce qui expliquerait mes nouveaux problèmes!
J'aurais besoin d'nue requète comme ceci:


(SELECT     TOP 5 'TABLE1' AS __SOURCE__, val1, val2, val3, val4, val5, val6, val7, val8, val9, val10, val11, val12
FROM         TABLE1
ORDER BY val1, val2, val3
UNION
SELECT     TOP 5 'TABLE2' AS __SOURCE__, VAL1, VAL2, VAL3, VAL4, VAL5, VAL6, VAL7, VAL8, VAL9, VAL10, VAL11, VAL12
FROM         TABLE2
ORDER BY val1, val2, val3
) ORDER BY __SOURCE__


 
Mais si tu dis qu'on n'peux pas appliquer de ORDER BY aux membres d'un UNION, c normal que ça passe pas. Du coup qqn voit une solution a cet inextriquable problème !?


Ou bien j'ai rien compris, ou bien il suffit de faire  
SELECT     TOP 5 'TABLE1' AS __SOURCE__, val1, val2, val3, val4, val5, val6, val7, val8, val9, val10, val11, val12
FROM         TABLE1
UNION
SELECT     TOP 5 'TABLE2' AS __SOURCE__, VAL1, VAL2, VAL3, VAL4, VAL5, VAL6, VAL7, VAL8, VAL9, VAL10, VAL11, VAL12
FROM         TABLE2
ORDER By __SOURCE__, val1, val2, val3  
 [:spamafote]


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 09-12-2003 à 14:38:24    

tomlameche a écrit :


Ou bien j'ai rien compris, ou bien il suffit de faire  
SELECT     TOP 5 'TABLE1' AS __SOURCE__, val1, val2, val3, val4, val5, val6, val7, val8, val9, val10, val11, val12
FROM         TABLE1
UNION
SELECT     TOP 5 'TABLE2' AS __SOURCE__, VAL1, VAL2, VAL3, VAL4, VAL5, VAL6, VAL7, VAL8, VAL9, VAL10, VAL11, VAL12
FROM         TABLE2
ORDER By __SOURCE__, val1, val2, val3  
 [:spamafote]  


 
Non non, c'est pas le même chose. Cela dit c'est pas de ta faute, tu pouvais pas savoir avec l'exemple que j'ai donné.
En fait le "order by" du 1er membre peut être différent de celui du 2e membre. En fait, on pourrait très bien avoir (ces requètes sont générées par un programme que j'écris) :
 


(SELECT     TOP 5 'TABLE1' AS __SOURCE__, val1, val2, val3, val4, val5, val6, val7, val8, val9, val10, val11, val12
FROM         TABLE1
ORDER BY [g]val7, val3, val1[/g]
UNION
SELECT     TOP 5 'TABLE2' AS __SOURCE__, VAL1, VAL2, VAL3, VAL4, VAL5, VAL6, VAL7, VAL8, VAL9, VAL10, VAL11, VAL12
FROM         TABLE2
ORDER BY [g]val2, val6, val11[/g]
) ORDER BY __SOURCE__  


 
C'est très important, car chaque "top" dépend de ces order by.
Mais là ça devient vraiment compliqué, j'vais être obligé de me démerder pour passer par des vues je crois.


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Marsh Posté le 09-12-2003 à 14:49:07    

El_gringo a écrit :


 
Non non, c'est pas le même chose. Cela dit c'est pas de ta faute, tu pouvais pas savoir avec l'exemple que j'ai donné.
En fait le "order by" du 1er membre peut être différent de celui du 2e membre. En fait, on pourrait très bien avoir (ces requètes sont générées par un programme que j'écris) :
 


(SELECT     TOP 5 'TABLE1' AS __SOURCE__, val1, val2, val3, val4, val5, val6, val7, val8, val9, val10, val11, val12
FROM         TABLE1
ORDER BY [g]val7, val3, val1[/g]
UNION
SELECT     TOP 5 'TABLE2' AS __SOURCE__, VAL1, VAL2, VAL3, VAL4, VAL5, VAL6, VAL7, VAL8, VAL9, VAL10, VAL11, VAL12
FROM         TABLE2
ORDER BY [g]val2, val6, val11[/g]
) ORDER BY __SOURCE__  


 
C'est très important, car chaque "top" dépend de ces order by.
Mais là ça devient vraiment compliqué, j'vais être obligé de me démerder pour passer par des vues je crois.


Ah oui, en effet, c'est pas très pratique ce que tu veux ...
Une idée, peut être : tu ajoute un champ dans ta requete correspondant à la concaténation des valeurs à trier pour chaque table.
Par exemple :
SELECT     TOP 5 'TABLE1' AS __SOURCE__, val1, val2, val3, val4, val5, val6, val7, val8, val9, val10, val11, val12, val7 || val3 || val1 as var_tri
FROM         TABLE1
UNION
SELECT     TOP 5 'TABLE2' AS __SOURCE__, VAL1, VAL2, VAL3, VAL4, VAL5, VAL6, VAL7, VAL8, VAL9, VAL10, VAL11, VAL12,val2 || val6 || val11 as var_tri
FROM         TABLE2
ORDER BY __SOURCE__, val_tri  


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 09-12-2003 à 15:28:39    

Merci, c'est une bonne idée ça. Mais ça va poser tout un tas de compliquations. Finalement j'suis en train de m'en sortir avec des vues.


---------------
Les Vers Solitaires, on aime ... ou pas !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed