2012-05-17 6 views

risposta

42

Se volete UNION in modo che è possibile combinare i risultati delle query, si può usare subselect in BigQuery:

SELECT foo, bar 
FROM 
    (SELECT integer(id) AS foo, string(title) AS bar 
    FROM publicdata:samples.wikipedia limit 10), 
    (SELECT integer(year) AS foo, string(state) AS bar 
    FROM publicdata:samples.natality limit 10); 

Questo è quasi esattamente equivalente a SQL

SELECT id AS foo, title AS bar 
FROM publicdata:samples.wikipedia limit 10 
UNION ALL 
SELECT year AS foo, state AS bar 
FROM publicdata:samples.natality limit 10; 

(si noti che, se desidera SQL UNION e non UNION TUTTO questo non funzionerà)

In alternativa, è possibile eseguire due query e aggiungere il risultato.

+0

ahh ... molto intelligente. L'aggiunta di due query non è un'opzione nel mio caso, ma questa costruzione sembra che dovrebbe funzionare. – mdahlman

+2

Come nota, come hai detto, questa non è esattamente UNION, ma piuttosto UNION ALL [Vedi altro post] (http: // stackoverflow.it/questions/49925/what-is-the-difference-between-union-and-union-all) – hoggkm

+0

ciao @ Jordan-Tigani se chiamo la query come sopra, allora i record migliori saranno di wikipedia e poi di natalità. Voglio sapere se le sequenze mantengono o no. voglio solo clerificare. –

0

I sindacati sono effettivamente supportati. Un estratto dal link che hai postato:

Nota: Diversamente da molti altri sistemi basati su SQL, BigQuery utilizza la sintassi della virgola per indicare i join di tabella, non i join. Ciò significa che è possibile eseguire una query su più tabelle con schemi compatibili come segue:

// Trova le attività sospette di diversi giorni

SELECT FORMAT_UTC_USEC(event.timestamp_in_usec) AS time, request_url 
    FROM [applogs.events_20120501], [applogs.events_20120502], [applogs.events_20120503] 
    WHERE event.username = 'root' AND NOT event.source_ip.is_internal; 
+0

Questo si riferisce alle tabelle di unione per la fonte. Questa è la caratteristica che ho menzionato specificamente in quanto non è ciò di cui ho bisogno. – mdahlman

+0

Ah capisco. Inizialmente non ho capito cosa intendi per "unione per la fonte". In realtà finisco per fare qualcosa di simile a quello suggerito da Jordan per uno scenario in cui ho bisogno dei nomi delle tabelle nel set di risultati. Inserisco il nome_tabella nelle query interne e li seleziono dalla query esterna, ad es. SELECT table_name, title, state FROM (SELEZIONA "publicdata: samples.wikipedia" AS nome_tabella, stringa (titolo) AS titolo FROM publicdata: samples.wikipedia limite 10), (SELEZIONA "publicdata: samples.natality" AS nome_tabella, stringa (stato) AS stato FROM publicdata: samples.natality limit 10) –

2

Si può sempre fare:

SELECT * FROM (query 1), (query 2); 

Si fa il stessa cosa:

SELECT * from query1 UNION select * from query 2; 
+4

Sì, questo funziona. È identico a quello pubblicato dalla Jordan 2,5 anni fa. – mdahlman

4

BigQuery ha recentemente aggiunto il supporto per Standard SQL, compresa l'operazione UNION.


Al momento della presentazione di una query tramite l'interfaccia utente web, basta assicurarsi di deselezionare "Usa Legacy SQL" sotto la rubrica versione di SQL: enter image description here

+2

Tuttavia, è importante utilizzare UNION con una seconda parola chiave: UNION ALL o UNION DISTINCT, vedere [il seguente link] (https://cloud.google.com/bigquery/docs/reference/standard-sql/query -syntax # union) –

+0

@RogierWerschkull true dat. – olebebo

0

Si noti che, se si sta utilizzando SQL standard, il operatore virgola ora significa JOIN-you have to use the UNION syntax if you want a union:

In eredità SQL, l'operatore virgola, ha il significato non standard di UNION ALL se applicato alle tabelle. Nell'SQL standard, l'operatore virgola ha il significato standard di JOIN.

Ad esempio:

#standardSQL 
SELECT 
    column_name, 
    count(*) 
from 
    (SELECT * FROM me.table1 UNION ALL SELECT * FROM me.table2) 
group by 1