2010-12-15 36 views
1

Je ne sais pas si ce que je veux faire est possible, mais je suis curieux.Comment faire cette requête dans une requête?

J'ai une table de temps qui ressemble à ce que

timeTable 
--------- 
_id 
date 

J'ai une autre table stockée qu'avec timeinfo qui est un ForeignKey au calendrier

myTable 
------- 
action 
date_id 

Maintenant, ce que je voudrais do met à jour le date_id avec l'id de la même date le mois prochain. Je sais que cette requête ne peut pas fonctionner car la requête renvoie une date à laquelle elle s'attend à un uuid.

Ma question: Est-il possible de récupérer le date_id de la même date le mois suivant avec une requête sans sous-requête anohter? Que ma requête réelle, je ne vois pas comment pourrais-je le faire. Une idée ?

SELECT date + interval '1 month' FROM dimtime INNER JOIN roadmap ON _id = date_id 
+0

Je crains que vous ayez à utiliser une sous-requête pour obtenir l'identifiant. Pourquoi ne voulez-vous pas utiliser une sous-requête de toute façon? –

+0

Cela ne me dérange pas ce que je fais. J'ai juste parce que + intervalle '1 mois' est quelque chose savait que je pourrais tromper la requête. Cette question est juste par curiosité. – Spredzy

+0

Vos requêtes listent les noms des tables que vous n'avez pas décrites. S'il vous plaît modifier votre question, je ne peux pas vraiment comprendre ce que vous essayez de faire. –

Répondre

0

Peut-être quelque chose comme ceci:

Edité

UPDATE myTable t1 
SET t1.date_id = (SELECT t2._id FROM timeTable t2 WHERE t2.date = (SELECT t3.date + interval '1 month' FROM timeTable t3 WHERE t3._id = t1.date_id)); 
+0

Cela fonctionne mais ce n'est pas ce que je demandais. Je demandais au député de le faire sans une deuxième sous-requête. Voici votre solution utilise une deuxième sous-requête – Spredzy

+0

Ah, désolé, évidemment, je n'ai pas lu votre question suffisamment à fond. Je ne connaîtrais pas un autre moyen de le faire. – morja

0

Il est un hack méchant, mais si votre SGBDR supporte une conversion déterministe entre types de données entières et la date, il y a un moyen de faites-le sans aucune sous-requête, mais il est presque certain d'exiger des changements aux données existantes.

La solution nécessite que vous utilisiez la représentation entière de la date comme clé dans timeTable (plutôt que d'attribuer des valeurs arbitrairement). Si vous faites cela, alors vous pouvez effectuer des calculs de date sans avoir besoin de rechercher la valeur de la date de timeTable. Cela supprime le besoin d'inclure timeTable dans la requête (sauf si vous avez besoin de valider que la nouvelle date existe). Dans ce scénario, pseudo-SQL pour votre requête deviendrait:

UPDATE myTable 
SET date_id = to_int(to_date(date_id) + interval `1 month`)) 
; 

Si l'int < -> conversion de la date est implicite dans votre SGBDR, il devient encore plus court:

UPDATE myTable 
SET date_id = date_id + interval `1 month` 
; 

Cependant, si vous Au moment où vous pouvez choisir d'implémenter cette conception, il est préférable de supprimer le lien timeTable et de stocker un type de date natif dans la table cible plutôt que le nombre entier FK.