1
votes

Existe-t-il une fonction SQL pour développer la table?

Je me souviens vaguement qu'il y avait une fonction qui faisait cela, mais je pense que je deviens peut-être fou.

Disons que j'ai un datatable, appelez-le table1. Il comporte trois colonnes: colonne1, colonne2, colonne3. La requête

 SELECT * FROM table1 

renvoie toutes les lignes / colonnes de table1. N'existe-t-il pas un type de fonction EXPANDER qui me permet de dupliquer ce résultat? Par exemple, si je veux tout dupliquer trois fois à partir de la requête SELECT * FROM table1, je peux faire quelque chose comme EXPAND (3)?


1 commentaires

CROSS JOIN le tableau avec un tableau de pointage de 3 lignes.


4 Réponses :


1
votes

si vous voulez un produit cartésien (toute la combinaison sur une ligne), vous pouvez utiliser

SELECT *
FROM table1 
UNION ALL 
SELECT *
FROM table1 
UNION ALL 
SELECT *
FROM table1 

si vous voulez que les mêmes lignes soient répétées, vous pouvez utiliser UNION ALL

SELECT a.*, b.*, c.* 
FROM table1 a
CROSS JOIN table1 b
CROSS JOIN table1 c


0 commentaires

0
votes

Utilisez union all

   Create Procedure 
    expandTable(tablename 
     varchar2(50))
       As 
       Select * from table1
   Union all
   Select * from table1
    Union all
   Select * from table1
   Union all
   Select * from table1 
    End
    /

Pour des raisons de réutilisation, vous pouvez intégrer ce code dans une procédure comme

  Select * from table1
   Union all
   Select * from table1
    Union all
   Select * from table1
   Union all
   Select * from table1

p >


0 commentaires

2
votes

Dans BigQuery, je recommanderais un CROSS JOIN :

SELECT t1.*
FROM table1 CROSS JOIN
     UNNEST(GENERATE_ARRAY(1, 3)) n

Cela peut devenir fastidieux pour de nombreuses copies, mais vous pouvez simplifier cela en générant les nombres:

SELECT t1.*
FROM table1 CROSS JOIN
     (SELECT 1 as n UNION ALL SELECT 2 UNION ALL SELECT 3) n;

Ceci crée un tableau avec trois éléments et l'installe en lignes.

Dans ces deux cas, vous pouvez inclure n code > dans le SELECT pour distinguer les copies.


0 commentaires

2
votes

Ci-dessous est pour BigQuery Standard SQL

Je pense que ci-dessous est assez proche de ce qui "vous a rendu fou" o)

#standardSQL
CREATE TEMP FUNCTION EXPAND(s ANY TYPE, dups INT64) AS ( ARRAY(
  SELECT s FROM UNNEST(GENERATE_ARRAY(1, dups)) 
)); 
SELECT copy.*
FROM `project.dataset.tabel1` t, UNNEST(EXPAND(t, 3)) copy

Pour pouvoir le faire, vous peut tirer parti récemment de annoncé la prise en charge de UDF SQL standard persistantes , à savoir - vous devez créer FN.EXPAND () fonction comme dans l'exemple ci-dessous (note: vous devez avoir un jeu de données FN dans votre projet - ou utiliser un jeu de données existant auquel cas vous devriez utiliser la référence YOUR_DATASET.EXPAND ()

#standardSQL
CREATE FUNCTION FN.EXPAND(s ANY TYPE, dups INT64) AS ( 
  ARRAY (
  SELECT s FROM UNNEST(GENERATE_ARRAY(1, dups)) 
  )
); 

Enfin , si vous ne voulez pas créer de UDF persistante - vous pouvez utiliser une UDF temporaire comme dans l'exemple ci-dessous

#standardSQL
SELECT copy.*
FROM `project.dataset.tabel1` t, UNNEST(FN.EXPAND(t, 3)) copy


2 commentaires

C'est une approche de haut niveau plus approfondie de ce qui pourrait être réalisé via un produit union all ou cartésien et, si cela est vraiment nécessaire, peut créer une personnalisation en intégrant la requête cartésion ou union dans une procédure (nomtable) et peut l'utiliser à tout moment


consultez stackoverflow.com/q/59305598/5221944 pour voir pourquoi / quand cette version peut être très utile: o)