2017-09-13 1 views
0

Veuillez trouver ci-dessous la requête fournie que je suis capable d'implémenter dans Netezza où, dans le cas où il n'y a pas de jointure sur 'id' alors il cherche la jointure sur la base de «nom». Si l'un des critères est rempli, la jointure externe gauche est effectuée.Fournir plusieurs critères de jointure à l'aide de l'opérateur conditionnel 'OR' dans Bigquery

Select * from BigqueryTest.colors a 
LEFT JOIN 
BigqueryTest.color2 b 
ON a.id = b.id 
OR a.name = b.name ; 

Cette fonctionnalité ne semble pas être prise en charge dans Bigquery. Je veux dire que je peux fournir plusieurs conditions de jointure avec l'aide de l'opérateur 'AND' mais je ne peux pas utiliser l'opérateur 'OU' qui peut me permettre d'aller de l'avant avec l'opération de jointure même si une seule condition est satisfaite. Toute piste serait appréciée.

+0

ne sais pas pourquoi il ne supporte pas 'OR', mais vous pouvez les diviser en deux parties, et' union' Toutes mes excuses – LONG

+0

Toutes mes excuses car je n'ai pas beaucoup d'expérience pour peaufiner les pièces SQL. Alors, pourriez-vous être plus précis: comment diviser cette requête en fonction des conditions séparées par «OU». –

+1

'Select * from BigqueryTest.colors une LEFT JOIN BigqueryTest.color2 b SUR a.id = b.id UNION Select * from BigqueryTest.colors une GAUCHE REJOIGNEZ BigqueryTest.color2 b ON a.name = b. name; 'mais ne sais toujours pas pourquoi vous ne pouvez pas utiliser' OR' – LONG

Répondre

3

... is there any way around to make the code run with 'OR' condition? Because in actual scenario there are more than 100 columns ...

Ci-dessous est une autre option - comme une direction pour vous d'explorer.

#standardSQL 
SELECT a.id AS aid, a.name AS aname, b.id AS bid, b.name AS bname 
FROM (
    SELECT 
     a, IF(matches = 0, STRUCT<id INT64, name STRING>(NULL, NULL), b) AS b 
    FROM (
     SELECT 
      a, b, 
      (a.id = b.id OR a.name = b.name) AS match, 
      COUNTIF(a.id = b.id OR a.name = b.name) 
       OVER(PARTITION BY a.id, a.name) AS matches, 
      ROW_NUMBER() OVER(PARTITION BY a.id, a.name) AS dup 
     FROM `BigqueryTest.colors` AS a 
     CROSS JOIN `BigqueryTest.color2` AS b 
    ) 
    WHERE match OR (matches = 0 AND dup = 1) 
) 
-- ORDER BY a.id 

Vous pouvez tester/jouer avec l'aide des données factices ci-dessous

#standardSQL 
WITH `BigqueryTest.colors` AS (
    SELECT 1 AS id, 'a' AS name UNION ALL 
    SELECT 2 AS id, 'b' AS name UNION ALL 
    SELECT 3 AS id, 'c' AS name 
), 
`BigqueryTest.color2` AS (
    SELECT 1 AS id, 'a' AS name UNION ALL 
    SELECT 11 AS id, 'a' AS name UNION ALL 
    SELECT 2 AS id, 'b' AS name UNION ALL 
    SELECT 2 AS id, 'x' AS name 
) 
SELECT a.id AS aid, a.name AS aname, b.id AS bid, b.name AS bname 
FROM (
    SELECT 
    a, IF(matches = 0, STRUCT<id INT64, name STRING>(NULL, NULL), b) AS b 
    FROM (
    SELECT 
     a, b, 
     (a.id = b.id OR a.name = b.name) AS match, 
     COUNTIF(a.id = b.id OR a.name = b.name) OVER(PARTITION BY a.id, a.name) AS matches, 
     ROW_NUMBER() OVER(PARTITION BY a.id, a.name) AS dup 
    FROM `BigqueryTest.colors` AS a 
    CROSS JOIN `BigqueryTest.color2` AS b 
) 
    WHERE match OR (matches = 0 AND dup = 1) 
) 
ORDER BY a.id 
1

est ci-dessous pour BigQuery standard SQL

#standardSQL 
SELECT 
    a.id AS aid, a.name AS aname, 
    b.id AS bid, b.name AS bname 
FROM `BigqueryTest.colors` AS a 
LEFT JOIN `BigqueryTest.color2` AS b 
ON a.id = b.id 
UNION DISTINCT 
SELECT 
    a.id AS aid, a.name AS aname, 
    b.id AS bid, b.name AS bname 
FROM `BigqueryTest.colors` AS a 
LEFT JOIN `BigqueryTest.color2` AS b 
ON a.name = b.name 
+0

Merci !!! Cela fonctionne mais il n'y a aucun moyen de faire fonctionner le code avec la condition 'OU'. Parce que dans le scénario actuel il y a plus de 100 colonnes et beaucoup d'autres conditions de jointure, donc les séparer et utiliser 'Union' ne semble pas être une solution standard.Cependant, appréciez hautement pour cette solution de contournement. –

+1

L'utilisation de 'OR' avec' JOIN' n'est pas très bien mise à l'échelle car BigQuery ne peut pas partitionner la table de hachage (afin de paralléliser le calcul) sur une clé particulière. Alternativement, vous pouvez utiliser 'CROSS JOIN' avec une condition arbitraire. –