Platzhaltertabellen

Mit einer Platzhaltertabelle können Sie mehrere Tabellen mit kurzen SQL-Anweisungen abfragen. Eine Platzhaltertabelle stellt eine Zusammenführung aller Tabellen dar, die mit dem Platzhalterausdruck übereinstimmen.

Tabellenplatzhalter sind nur in Standard-SQL verfügbar. Entsprechende Funktionen in Legacy-SQL finden Sie unter Tabellenplatzhalter-Funktionen.

Eine Übersicht über Platzhaltertabellen finden Sie unter Mehrere Tabellen mit einer Platzhaltertabelle abfragen.

Syntax der Platzhaltertabelle

Syntax der Platzhaltertabelle:

SELECT
FROM
  `<project-id>.<dataset-id>.<table-prefix>*`
WHERE
  bool_expression
<project-id>
Cloud Platform-Projekt-ID. Optional, wenn Sie Ihre Standard-Projekt-ID verwenden.
<dataset-id>
BigQuery-Dataset-ID
<table-prefix>
Ein String, der für alle Tabellen gemeinsam verwendet wird, die mit dem Platzhalterzeichen übereinstimmen. Das Tabellenpräfix ist optional. Wenn das Tabellenpräfix weggelassen wird, bedeutet dies, dass alle Tabellen in dem Dataset übereinstimmen müssen.
* (Platzhalterzeichen)
Das Platzhalterzeichen, "*", stellt ein oder mehrere Zeichen eines Tabellennamens dar. Das Platzhalterzeichen kann nur das letzte Zeichen eines Platzhaltertabellennamens sein.

Abfragen mit Platzhaltertabellen unterstützen die Pseudospalte _TABLE_SUFFIX in der WHERE-Klausel. Diese Spalte enthält die Werte, die mit dem Platzhalterzeichen übereinstimmen, sodass Abfragen filtern können, auf welche Tabellen zugegriffen wird. Die folgenden WHERE-Klauseln verwenden beispielsweise Vergleichsoperatoren, um die übereinstimmenden Tabellen zu filtern:

WHERE
  _TABLE_SUFFIX BETWEEN '29' AND '40'

WHERE
  _TABLE_SUFFIX = '1929'

WHERE
  _TABLE_SUFFIX < '1941'

Weitere Informationen zur Pseudospalte _TABLE_SUFFIX finden Sie unter Ausgewählte Tabellen mit _TABLE_SUFFIX filtern.

Tabellennamen mit Platzhaltern in Graviszeichen setzen

Der Platzhaltertabellenname enthält das Sonderzeichen (*). Dies bedeutet, dass Sie den Platzhaltertabellennamen in Graviszeichen (`) setzen müssen. Beispiel: Die folgende Abfrage ist gültig, weil sie Graviszeichen verwendet:

#standardSQL
/* Valid standard SQL query */
SELECT
  max
FROM
  `bigquery-public-data.noaa_gsod.gsod*`
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

Die folgende Abfrage ist NICHT gültig, weil sie nicht korrekt in Graviszeichen steht:

#standardSQL
/* Syntax error: Expected end of statement but got "-" at [4:11] */
SELECT
  max
FROM
  # missing backticks
  bigquery-public-data.noaa_gsod.gsod*
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

Anführungszeichen können nicht verwendet werden:

#standardSQL
/* Syntax error: Unexpected string literal: 'bigquery-public-data.noaa_gsod.gsod*' at [4:3] */
SELECT
  max
FROM
  # quotes are not backticks
  'bigquery-public-data.noaa_gsod.gsod*'
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

Legacy-SQL-Tabellenplatzhalterfunktionen migrieren

In Legacy-SQL können Sie die folgenden Tabellenplatzhalterfunktionen zur Abfrage mehrerer Tabellen verwenden.

  • TABLE_DATE_RANGE() und TABLE_DATE_RANGE_STRICT()
  • TABLE_QUERY()

TABLE_DATE_RANGE()-Funktionen

Die Legacy-SQL-Funktionen TABLE_DATE_RANGE() werden für Tabellen verwendet, die einem bestimmten Namensschema entsprechen: <prefix>YYYYMMDD, wobei <prefix> den ersten Teil eines Tabellennamens und YYYYMMDD das Datum der Tabellendaten darstellt.

Beispiel: Die folgende Legacy-SQL-Abfrage sucht die durchschnittliche Temperatur aus einer Gruppe von Tagestabellen, die die Wetterdaten für den Bereich Seattle enthalten:

#legacySQL
SELECT
  ROUND(AVG(TemperatureF),1) AS AVG_TEMP_F
FROM
  TABLE_DATE_RANGE([mydataset.sea_weather_],
                    TIMESTAMP("2016-05-01"),
                    TIMESTAMP("2016-05-09"))

In Standard-SQL verwendet eine entsprechende Abfrage einen Tabellenplatzhalter und die BETWEEN-Klausel.

#standardSQL
SELECT
  ROUND(AVG(TemperatureF),1) AS AVG_TEMP_F
FROM
  `mydataset.sea_weather_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20160501' AND '20160509'

TABLE_QUERY()-Funktion

Mit der Legacy-SQL-Funktion TABLE_QUERY() können Sie Tabellennamen anhand von Mustern suchen. Wenn Sie eine TABLE_QUERY()-Funktion zu Standard-SQL migrieren, das die TABLE_QUERY()-Funktion nicht unterstützt, können Sie stattdessen mit der Pseudospalte _TABLE_SUFFIX filtern. Beachten Sie bei der Migration die folgenden Unterschiede:

  • In Legacy-SQL setzen Sie die TABLE_QUERY()-Funktion in die FROM-Klausel, während Sie in Standard-SQL mit der Pseudospalte _TABLE_SUFFIX in der WHERE-Klausel filtern.

  • In Legacy-SQL verwendet die TABLE_QUERY()-Funktion den ganzen Tabellennamen (oder table_id), während in Standard-SQL die Pseudospalte _TABLE_SUFFIX einen Teil oder den ganzen Tabellennamen enthält, je nachdem wie Sie das Platzhalterzeichen verwenden.

Filter in der WHERE-Klausel

Verschieben Sie bei der Migration von Legacy- zu Standard-SQL den Filter in die WHERE-Klausel. Beispiel: Die folgende Abfrage sucht die Höchsttemperaturen in allen Jahren, die auf die Ziffer 0 enden:

#legacySQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  year
FROM
  TABLE_QUERY([bigquery-public-data:noaa_gsod],
               'REGEXP_MATCH(table_id, r"0$")')
WHERE
  max != 9999.9 # code for missing data
  AND max > 100 # to improve ORDER BY performance
ORDER BY
  max DESC

In Standard-SQL verwendet eine entsprechende Abfrage einen Tabellenplatzhalter und setzt die reguläre Ausdrucksfunktion REGEXP_CONTAINS() in die WHERE-Klausel:

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  year
FROM
  `bigquery-public-data.noaa_gsod.gsod*`
WHERE
  max != 9999.9 # code for missing data
  AND max > 100 # to improve ORDER BY performance
  AND REGEXP_CONTAINS(_TABLE_SUFFIX, r"0$")
ORDER BY
  max DESC

Unterschiede zwischen table_id und _TABLE_SUFFIX

In der Legacy-SQL-Funktion TABLE_QUERY(dataset, expr) ist der zweite Parameter ein Ausdruck, der für den gesamten Tabellennamen ausgeführt wird und den Wert table_id verwendet. Bei der Migration zu Standard-SQL wird der Filter, den Sie in der WHERE-Klausel erstellen, für den Wert von _TABLE_SUFFIX ausgeführt, der einen Teil oder den ganzen Tabellennamen enthalten kann, je nachdem, wie Sie das Platzhalterzeichen verwenden.

Beispiel: Die folgende Legacy-SQL-Abfrage verwendet den ganzen Tabellennamen in einem regulären Ausdruck, um die Höchsttemperaturen in allen Jahren zu ermitteln, die auf die Ziffer 0 enden:

#legacySQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  year
FROM
  TABLE_QUERY([bigquery-public-data:noaa_gsod],
               'REGEXP_MATCH(table_id, r"gsod\d{3}0")')
WHERE
  max != 9999.9 # code for missing data
  AND max > 100 # to improve ORDER BY performance
ORDER BY
  max DESC

In Standard-SQL kann eine entsprechende Abfrage den ganzen Tabellennamen oder nur einen Teil des Tabellennamens verwenden. Sie können ein leeres Präfix in Standard-SQL verwenden, sodass der Filter für den gesamten Tabellennamen ausgeführt wird:

# Standard SQL empty prefix
FROM
  `bigquery-public-data.noaa_gsod.*`

Längere Präfixe bieten jedoch eine bessere Leistung als leere Präfixe. Daher wird im folgenden Beispiel ein längeres Präfix verwendet, d. h., der Wert von _TABLE_SUFFIX ist nur Teil des Tabellennamens.

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  year
FROM
  `bigquery-public-data.noaa_gsod.gsod*`
WHERE
  max != 9999.9 # code for missing data
  AND max > 100 # to improve ORDER BY performance
  AND REGEXP_CONTAINS(_TABLE_SUFFIX, r"\d{3}0")
ORDER BY
  max DESC

Beschränkungen

Weitere Informationen finden Sie unter Mehrere Tabellen mit einer Platzhaltertabelle abfragen.