0
votes

Fusionner trois tables dans Sélectionner une requête par règle 3, 2, 1 enregistrements de chaque table

fusion de trois tables dans un Sélectionnez Query par règle 3, 2, 1 enregistrements de chaque tableau comme suit:

  • Tablea: ID, Fielda, Fieldb, FieldC, ....
  • tableb: id, fielda, champ, champ, ....
  • Napp: ID, Fielda, Fieldb, FieldC, ....

  • ID : numéro automatique dans chaque table

  • Fielda sera unique dans les trois tables.

    Je recherche un Sélectionnez Query pour fusionner trois tables comme suit:

    • Top trois enregistrements de Tablea triés par ID
    • Top deux enregistrements de tableb triés par ID
    • TOP 1 Enregistrez de Napp Trié par ID

      Répétez cette opération jusqu'à sélectionner tous les enregistrements des trois tables.

      Si une table comporte moins d'enregistrements ou ne répond pas aux critères, ignorez et continuez avec d'autres.

      Ma tentative:

      Je l'ai fait totalement par voie de programmation, comme des curseurs et des si conditions dans une procédure stockée SQL Server.

      Cela fait de retard.


5 commentaires

Qu'est-ce que tu as essayé jusque-là?


@iminiki fabriquez une table TMP remplie de 1000 identifiants ou de nombres totaux de trois tables, puis à l'aide de curseur SQL, tandis que la boucle, si des conditions et des variables ont rempli de table TMP et utilisez la dernière requête.


Le curseur est-il accepté pour votre processus.


Si des tables contiennent 7 lignes, alors que doit-on votre sortie?


Tablea, Tablea, Tablea, Tableb, Tableb, Tableau, Tablea, Tablea, Tablea, Tableb, Tableau, Tableau, Tableb, Tableb, Tableb, Tableb, Tableb, Tableb, Tableb, Tableau, Nappe, Napper ,


4 Réponses :


0
votes

Il n'y a pas beaucoup d'informations à utiliser ici, mais je suppose que vous pouvez utiliser Union pour combiner plusieurs déclarations. xxx

exécuter et voir si cela fonctionne.

/ AF


2 commentaires

Cette question concerne (Microsoft) SQL Server - et ni SQL Server, ni la norme ANSI / ISO SQL connaissent une limite limite .....


Merci pour la note! @marc_s



0
votes

Ceci nécessite une formule qui prend des numéros de ligne à partir de chaque table et la transforme en une série d'entiers qui sautent les valeurs souhaitées.

Dans la requête ci-dessous, j'ajoute du CTE pour le bien de raccourcir la formule. La vraie magie est dans le Union code>. En outre, j'ajoute un champ supplémentaire pour votre contrôle. N'hésitez pas à vous en débarrasser. P>

WITH A_Aux as (
SELECT 'A' As FromTable, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, TableA.*
FROM TableA
), B_Aux AS (
SELECT 'B' As FromTable, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, TableB.*
FROM TableB
), C_Aux AS (
SELECT 'C' As FromTable, ROW_NUMBER() OVER (Order BY ID) AS RowNum, TableC.*
FROM TableC
)
SELECT *
FROM (
    SELECT RowNum+3*FLOOR((RowNum-1)/3) As ColumnForOrder, A_Aux.* FROM A_Aux
    UNION ALL
    SELECT 3+RowNum+4*FLOOR((RowNum-1)/2), B_Aux.* FROM B_Aux
    UNION ALL
    SELECT 6*RowNum, C_Aux.* FROM C_Aux
) T
ORDER BY ColumnForOrder


1 commentaires

C'est beaucoup mieux jusqu'à maintenant.



0
votes

Vous pouvez essayer ceci ..

    GO

    select * into #temp1 from (select  * from  table1) as t1
    select * into #temp2 from (select  * from  table2) as t2
    select * into #temp3 from (select  * from  table3) as t3

    select * into #final from (select col1, col2, col3 from #temp1 where 1=0) as tb

    declare @i int

    set @i=1
    while( (select COUNT(*) from #temp1)>@i)
    Begin

    ;with ct1 as (
    select ROW_NUMBER() over (order by id) as Slno, * from #temp1
    ),ct2 as (
    select ROW_NUMBER() over (order by id) as Slno, * from #temp2
    ),ct3 as (
    select ROW_NUMBER() over (order by id) as Slno, * from #temp3
    ),cfinal as (
    select top 3 * from #temp1
    union all
    select top 2 * from #temp2
    union  all
    select top 1 * from #temp3
    )
    insert into #final ( col1 , col2, col3 )
    select col1, col2, col3 from cfinal

    delete from #temp1 where id in (select top 3 ID from #temp1)
    delete from #temp2 where id in (select top 2 ID from #temp2)
    delete from #temp3 where id in (select top 1 ID from #temp3)

    set @i = @i+1

    End

    Select * from #final

    Drop table #temp1
    Drop table #temp2
    Drop table #temp3

    GO


0 commentaires

0
votes

De ma compréhension, je crée trois tables Temps comme Ta, TB, TC. xxx

Si des tables correspondent à vos tables, la sortie ressemble à a, a, a, b, b, c, a, a, b, b, c, a , B, c, c, c

t-sql xxx

laisse-moi expliquer le t- SQL: Avant cela, fyr: NTILE et numéro de rang

  1. Obtenez le comte.
  2. Trouvez le quotient qui passera à la fonction Ntile.
  3. ordre par la valeur ntile et statique.

    Remarque:

    1. J'utilise SQL Server 2017.
    2. Si T-SQL fonctionne bien, vous devez modifier la colonne dans commander par . .

0 commentaires