2010-12-15 17 views
1

eIch weiß nicht, ob das, was ich tun möchte, möglich ist, aber ich bin neugierig.Wie wird diese Abfrage in einer Abfrage ausgeführt?

Ich habe eine Zeittafel, die wie die

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

sieht habe ich eine andere Tabelle, die mit Zeitinfo gespeichert, dass das ein ForeignKey des Fahrplans ist

myTable 
------- 
action 
date_id 

Nun, was würde Ich mag an Aktualisieren Sie die Date_id mit der ID des gleichen Datums nächsten Monat.

Ich weiß, dass diese Abfrage nicht funktionieren kann, da die Abfrage ein Datum zurückgibt, wo es eine Uuid erwartet.

Meine Frage: Ist es möglich, die date_id vom selben Tag im nächsten Monat mit einer Abfrage ohne anohter Unterabfrage abzurufen? Dass meine eigentliche Abfrage ich nicht sehe, wie könnte ich das machen. Irgendeine Idee ?

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

Ich befürchte, Sie müssen eine Subquery verwenden, um die ID zu erhalten. Warum willst du keine Sub-Abfrage verwenden? –

+0

Ich habe nichts dagegen, was ich mache. Ich nur, dass, weil + Intervall "1 Monat" etwas wusste, dass ich die Abfrage austricksen könnte. Diese Frage ist nur aus Neugierde. – Spredzy

+0

Ihre Abfragen enthalten Namen der Tabellen, die Sie nicht beschrieben haben. Bitte editiere deine Frage, ich kann nicht wirklich verstehen, was du versuchst zu tun. –

Antwort

0

Vielleicht so etwas wie folgt aus:

Herausgegeben

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

Das funktioniert aber das nicht was ich gefragt habe. Ich bat darum, es ohne eine zweite Unterabfrage zu tun. Hier verwendet Ihre Lösung eine zweite Unterabfrage – Spredzy

+0

Ah, sorry, offensichtlich habe ich Ihre Frage nicht gründlich genug gelesen. Ich würde keinen anderen Weg kennen, es zu tun. – morja

0

Es ist ein gemeiner Hack, aber wenn Ihr RDBMS eine deterministische Konvertierung zwischen ganzzahligen und Datum Datentypen unterstützt, gibt es eine Möglichkeit, tun Sie dies ohne irgendwelche Unterabfragen - aber es ist fast sicher, Änderungen an bestehenden Daten zu erfordern.

Die Lösung erfordert, dass Sie die Integer-Darstellung des Datums als Schlüssel in verwenden (anstatt willkürlich zugewiesene Werte). Wenn Sie dies tun, können Sie Datumsberechnungen durchführen, ohne den Datumswert von nachschlagen zu müssen. Dadurch entfällt die Notwendigkeit, in die Abfrage überhaupt timeTable aufzunehmen (es sei denn, Sie müssen bestätigen, dass das neue Datum dort existiert). In diesem Szenario pseudo-SQL für die Abfrage werden würde:

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

Wenn die int < -> Datum Konvertierung in Ihrem RDBMS implizit ist, wird es noch kürzer:

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

Wenn Sie jedoch An der Stelle, an der Sie wählen können, diesen Entwurf zu implementieren, sollten Sie besser den Link verwerfen und einen nativen Datentyp in der Zieltabelle anstatt in der Ganzzahl FK speichern.

Verwandte Themen