2016-09-30 1 views
0

Im Anschluss an die Beispiele hier bei https://cloud.google.com/bigquery/sql-reference/dml-syntax gefunden anhängen, kamen wir mit einer Art und Weise, die wir die 3. Stufe der Tabelle aktualisieren (specifications.dimensions) als solche:-Update 3. Ebene geschachtelten Tabelle einen Datensatz

UPDATE sd97dwo.DetailedInventory 
SET specifications.dimensions = 
    STRUCT<depth FLOAT64, height FLOAT64, width FLOAT64>(1, 2, 3) 
WHERE 
    product like '%washer%' 
    AND EXISTS(select 1 from unnest(comments) as c where c.comment like '%comment%') 

Was wir jetzt zu tun versuchen, ist, die Tabelle zu aktualisieren, um einen Datensatz an dieselbe Dimensionsstruktur anzuhängen. Die verschiedenen Wege, die wir versuchen, sind jedoch nicht erfolgreich. Wollte sehen, ob jemand irgendwelche Ideen hatte. Die nächstgelegene wir bekamen, war das unten, aber natürlich gibt alle Datensätze (wie mehrere Ergebnisse) für specifications.dimensions, so dass wir den Fehler „Scalar Unterabfrage erzeugt mehr als ein Element“

UPDATE sd97dwo.DetailedInventory 
SET specifications.dimensions 
    = (SELECT specifications.dimensions 
    UNION ALL 
    SELECT STRUCT<depth FLOAT64, height FLOAT64, width FLOAT64>(4.0,5.0,6.0)) 
WHERE 
    product like '%washer%' 
    AND EXISTS(select 1 from unnest(comments) as c where c.comment like '%comment%') 
+0

Andere aber könnte verwandt sein, wie haben Sie die harte Grenze von ** 48 ** maximale UPDATE/DELETE-Anweisungen pro Tag pro Tabelle überwunden? Oder versuchen, damit umzugehen? https://cloud.google.com/bigquery/sql-reference/data-manipulation-language – Pentium10

+0

Unser allgemeiner Gedanke ist, dass Google zu dem Zeitpunkt, an dem wir tatsächlich auf diese Ebene der Aktualisierungen kommen, bereit sein wird, die Quoten wie bei den meisten anderen zu erhöhen Dinge. Solange jedoch die Arbeit hinter den Kulissen eine komplett neue Tabelle mit den aktualisierten Feldern erstellt, werden wir aufgrund der Kosten/Zeit vor einer starken Nutzung zurückschrecken. Ich versuche nur, Vor- und Nachteile zu beweisen und die Syntax zu verstehen. Beachten Sie auch, dass es sich um Aktualisierungsvorgänge handelt und nicht um aktualisierte Felder. Wenn Sie also die meisten Ihrer Datensätze in einem einzigen Durchgang aktualisieren können (mit Joins oder mit e), benötigen Sie möglicherweise nicht so viele Tabellen pro Tabelle. – chillerm

+0

Ich bin besorgt, dass immer noch nicht passen, da das Abfrage-Limit 256K ist, die ein bisschen klein ist, wenn Sie die Werte in die Anweisungen setzen möchten. Auch wenn Sie die geänderten Werte in eine Tabelle setzen und das Update mit einem Join aus dieser Tabelle ausgeben, ist das ein wenig trickreich und schränkt die Verwendung ein. Nur Bedenken, die ich sehe. – Pentium10

Antwort

3

erhalten, was wir sind versuchen, jetzt zu tun, ist die Tabelle aktualisieren, um einen Datensatz an die gleichen Dimensionen Struktur anzuhängen.

Was ist Ihr Schema? Wenn Sie dasselbe Schema wie in der DML-Dokumentation verwenden, werden weder "Spezifikationen" noch "Dimensionen" wiederholt. Du kannst es also nicht anhängen. Aber Sie können sie direkt aktualisieren wie:

UPDATE sd97dwo.DetailedInventory 
SET specifications.dimensions.depth = 1, 
    specifications.dimensions.height = 2, 
    specifications.dimensions.width = 3 
WHERE 
    product like '%washer%' 
    AND EXISTS(select 1 from unnest(comments) as c where c.comment like '%comment%') 
+0

warum nicht einfach 'SET specifications.dimensions = STRUCT (1, 2, 3)' wie es im ersten Teil der Frage ist? Gibt es einen Vorteil, jedes Element spezifisch auszusprechen ?! –

+0

Danke für die Antwort Alex. Ich benutze die Strukturen aus den Dokumenten, wie Sie erwähnt haben, und habe wirklich nur versucht, über verschiedene Dinge nachzudenken, die ich in Zukunft machen möchte. Ein speziellerer Anwendungsfall ist die Implementierung von sich langsam ändernden Dimensionen innerhalb einer Verkaufstransaktion. Wir möchten historische Details zu skus in die Transaktion einbeziehen. Wir hätten ein ähnliches Schema: {TRANS_KEY, {[TRANS_LINE, SKU, SLS, {[SKU_CLASS, SKU_DEPT, EFF_DT]}}}} Wenn ein Element die Klasse/Abteilung ändert, möchte ich einen Datensatz zum vorhandenen TRANS_KEY hinzufügen/TRANS_LINE, die das alte {CLASS/DEPT/DT} und das neue anzeigt. – chillerm

+0

Keine Zeichen, also lassen Sie mich wissen, wenn Sie mehr Klarheit brauchen. Um das Update auszuführen, würde ich mich einer SKU-Tabelle anschließen, die die neuen Details für SKUS enthält. – chillerm

Verwandte Themen