2009-12-19 8 views
1

J'essaie d'écrire ce qui devrait ostensiblement, être relativement facile requêtes SQL - encore, je ne peux pas voir pour les faire fonctionner.Question (s) SQL embarrassante

Est-il possible d'écrire une requête qui ressemble à quelque chose comme ceci:

select t.name 
    from (select * 
      from mystoredproc(1,2,3) as t) 
where t.name = 'foobar' 

Deux problèmes avec la requête ci-dessus:

1) Tout d'abord tout, l'énoncé ci-dessus dosent travail. Mon moteur db (mySQL) se plaint:

erreur 1054 (42S22): Unknown column 'de t.name' dans 'liste des champs'

2) Je veux utiliser la table de retour t dans un SELF JOIN. Cependant, je ne veux pas devoir appeler mystoredproc (...) encore, parce que c'est un appel très cher .

Quelqu'un sait comment résoudre ces problèmes?

BTW, même si je me sers mySQL (pour l'instant), je préférerais que tout extrait de SQL proférée était db agnostique (par exemple ANSI SQL)

Répondre

11

Remplacer le ) as t) avec ) t, comme dans

select t.name from (select * from mystoredproc(1,2,3)) t where t.name = 'foobar' 

Pour votre deuxième problème: Alimentez le résultat de mystoredproc dans une table temporaire et SELECT à partir de celui-ci, puis vous pouvez faire une auto-jointure sans tracas.

+0

Nice ... problème potentiel cependant, en ce que c'est pour un backend web et j'ai besoin de faire la différence entre les appels successifs. Je pense à généraliser une clé pour chaque ensemble de disques, mais je pourrais être trop compliqué - des idées ici ..? –

+1

Les tables temporaires sont uniquement visibles pour la connexion à la base de données au cours de laquelle elles ont été créées. Ainsi, même si vous avez plusieurs appels simultanés, dont 'CREATE TEMPORARY TABLE myTempTable', toutes les connexions ont uniquement accès à leur propre ensemble de données dans cette table. Vous devrez peut-être utiliser des transactions, sinon la table pourrait disparaître au milieu de vos requêtes. –

+0

Vérifiez également avec le manuel: http://dev.mysql.com/doc/refman/5.0/fr/create-table.html –