sql >> Databáze >  >> RDS >> Mysql

Filtrujte řádky několika velkými vektory

Toto používá koncept cross join aka kartézský součin (všechny permutace). Vaše pole tedy vytvoří odvozenou tabulku (v paměti) s počtem řádků x*y*z , kde tyto x,y,z jsou velikosti polí. Pokud jste zadali pole velikosti 3, 4 a 5, odvozená tabulka by měla počet řádků 3*4*5=60.

Vámi dodané porovnávání pole, které vytváří řádek, bylo pouze 4*1*1=4

thing7 níže je vaše hlavní tabulka, kterou hledáte. covering index by měla tato věc létat i s tunou dat v ní. Krycí index je takový, ve kterém jsou poskytnuté informace poskytovány prostřednictvím skenování b-stromu indexu a že není vyžadováno čtení datové stránky. Proč? Protože potřebná data jsou v indexu. A ve vašem případě extrémně tenký.

Tabulky A B C slouží jako pole.

Jedinou další věcí je říci, že každá odvozená tabulka vyžaduje název. Dali jsme mu název xDerived v dotazu. Představte si odvozenou tabulku jako něco vráceného a použitého v paměti. Není to fyzická tabulka.

Schéma

create table thing7
(   id int auto_increment primary key,
    A int not null,
    B int not null,
    C int not null,
    index(A,B,C) -- covering index (uber-thin, uber-fast)
);

insert thing7(A,B,C) values
(1,2,7),  
(1,2,8), 
(2,2,1), 
(1,3,1);

create table A
(   id int auto_increment primary key,
    value int
);
create table B
(   id int auto_increment primary key,
    value int
);
create table C
(   id int auto_increment primary key,
    value int
);

Test 1

truncate table A;
truncate table B;
truncate table C;
insert A (value) values (1),(2),(3),(4);
insert B (value) values (2);
insert C (value) values (7);

select t7.* 
from thing7 t7  
join 
(   select A.value as Avalue, B.value as Bvalue, C.value as Cvalue 
    from A 
    cross join B 
    cross join C 
    order by a.value,b.value,c.value 
) xDerived 
on xDerived.Avalue=t7.A and xDerived.Bvalue=t7.B and xDerived.Cvalue=t7.C; 
+----+---+---+---+
| id | A | B | C |
+----+---+---+---+
|  1 | 1 | 2 | 7 |
+----+---+---+---+

..

Test 2

truncate table A;
truncate table B;
truncate table C;
insert A (value) values (1);
insert B (value) values (2);
insert C (value) values (0);

select t7.*
from thing7 t7 
join
(   select A.value as Avalue, B.value as Bvalue, C.value as Cvalue
    from A
    cross join B
    cross join C
    order by a.value,b.value,c.value
) xDerived
on xDerived.Avalue=t7.A and xDerived.Bvalue=t7.B and xDerived.Cvalue=t7.C;
-- no rows returned

Bylo by velmi snadné změnit to na vyhledávání založené na relacích. Existuje koncept, ve kterém pole k prohledávání (tabulky A B C) mají sloupec relace. Usnadnilo by to současné použití více uživateli. Ale to je přehnaná odpověď, ale zeptejte se, jestli o tom chcete více informací.




  1. Oracle Sql :Procedura, která v něm může vytvářet dočasné tabulky

  2. Jak tisknout Datagridview má tabulku ve VB

  3. Vícenásobné vložení SQL Oracle

  4. Jak nainstalovat a zabezpečit MariaDB na Ubuntu