2016-03-26 20 views
0

Bir sorguyu aşağıdaki gibi çalıştırmaya çalışıyorum ve BigQuery'de desteklenmiyor gibi görünüyor.JOIN Sorgu Sözdizimi Google BigQuery ile

SELECT lat, long, spot, spotMAC FROM [data.reports] t1 
JOIN [data.operators] t2 
ON t1.spot like CONCAT('%',t2.name,'%') 

Sorguyu oluşturmanın başka bir yolu var mı?

cevap

1

gibi bir şey deneyebilirsiniz, neye ihtiyacınız uygulamak için: Eğer (katılabilir o kesin katılmadan durum olması gerekmez hangi bazı alanını bulabiliriz, bu çalışması gerekir

SELECT ... 
FROM [Data.reports] t1 
INNER JOIN [data.operators] t2 
ON t1.<some field>=t2.<some field> 
WHERE t2.name CONTAINS t1.spot 

- Sadece ihtiyacınız olan hassas birleştirme koşulunu elde etmek için daha fazla başvuruda bulunan t2.name CONTAINS t1.spot ile eşleşen tüm kayıtları içermelidir.

böyle bir JOIN alan bulunamaz ise Buna göre bir (ON maddesini gerektirmez) CROSS JOIN:

SELECT ... 
FROM [data.reports] t1 
CROSS JOIN [data.operators] t2 
WHERE t2.name CONTAINS t1.spot 

CROSS JOIN olan bir sorgu ancak sadece makul büyüklükte tablolar için başarılı olacaktır.

0

başka bir seçenek: (hoşuna gidecek ve eğer başlangıç ​​noktası)

aşağıda

size bir fikir vermelidir burada
fikirdir bir şekilde kullanılabilecek olandan bu ekstra alanla [data.reports] Tablo zenginleştirmek katılmak kriterler

SELECT spot, match FROM JS(
(
    SELECT spot, pat 
    FROM (
    SELECT spot FROM [data.reports] 
) AS t1 
    CROSS JOIN (
    SELECT GROUP_CONCAT(UNIQUE(name), '|') AS pat FROM [data.operators] 
) AS t2 
) , 
spot, pat, 
"[{name: 'spot', type:'string'}, 
    {name: 'match', type:'string'}] 
", 
"function(r, emit) { 
    var re = new RegExp(r.pat, 'gi'); 
    var matches = r.spot.match(re); 
    if (matches) { 
    for (j=0; j < matches.length; ++j) { 
     emit({spot: r.spot, match: matches[j]}); 
    } 
    } 
}" 
) 

şimdi yerinde birlikte maç alanı var, sen = yy.name hangi tablosundan gelir sizin dış seçme alan net değil
xx.match ÜZERİNE JOIN yapabilir, bu yüzden öyleyim buradan ayrılıyor
.210 Eğer bu tamamlayacak umut senin aşağıda

testi içindir kendi:

SELECT spot, pat, match FROM JS(
(
    SELECT spot, pat 
    FROM (
    SELECT spot FROM 
    (SELECT '11aaa22ccc99' AS spot), 
    (SELECT '33aaa44' AS spot), 
    (SELECT '55bbb66' AS spot), 
    (SELECT '77ddd88' AS spot), 
) AS t1 
    CROSS JOIN (
    SELECT GROUP_CONCAT(UNIQUE(name), '|') AS pat FROM 
    (SELECT 'aaa' AS name), 
    (SELECT 'bbb' AS name), 
    (SELECT 'ccc' AS name), 
) AS t2 
) , 
spot, pat, 
"[{name: 'spot', type:'string'}, 
    {name: 'pat', type:'string'}, 
    {name: 'match', type:'string'}] 
", 
"function(r, emit) { 
    var re = new RegExp(r.pat, 'gi'); 
    var matches = r.spot.match(re); 
    if (matches) { 
    for (j=0; j < matches.length; ++j) { 
     emit({spot: r.spot, pat: r.pat, match: matches[j]}); 
    } 
    } 
}" 
) 
+0

Önemli SO üzerinde - Eğer 'işareti oylama altında, yayınlanan cevabın soldaki kene kullanarak answer' kabul edebilir . Bunun neden önemli olduğu konusunda http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235 adresine bakın! Ayrıca cevapta oy vermek de önemlidir. Yardımcı olan cevapları oylayın. Daha fazlası var ... Birisi sorunuza cevap verdiğinde ne yapacağınızı kontrol edebilirsiniz - http://stackoverflow.com/help/someone-answers. –