La unión de dos tablas diferentes en sus columnas correspondientes se puede realizar mediante bucles anidados , pero una forma más eficaz y escalable es utilizar mapas múltiples . La idea es mapear desde cada valor de columna que queramos unir a todas las filas que lo contienen, para generar un multimapa desde una tabla a partir de ambas tablas.
El mapa múltiple generado tiene que estar basado en hash. Hashing es esencialmente una técnica que convierte un elemento grande en un elemento pequeño que representa el mismo elemento. Por lo tanto, genere el mapa múltiple para la tabla más pequeña, disminuyendo así su tiempo de generación y tamaño de memoria.
Ejemplo:
Acercarse:
- Crea las dos tablas.
- Ahora, obtenga la ID de las columnas en ambas tablas.
- Luego cree e implemente un mapa múltiple para mapear a varias filas de la tabla B.
- Imprima el resultado después de los pasos anteriores.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for hashjoin on two tables #include <iostream> #include <string> #include <unordered_map> #include <vector> using namespace std; // Generate two tables to join using tab_t = vector<vector<string> >; // Table 1 tab_t tab1{ // Age Name { "32", "Rahul" }, { "25", "Anshul" }, { "17", "Lok" }, { "25", "Akil" }, { "17", "Anshul" } }; // Table 2 tab_t tab2{ // Student Friend { "Rahul", "Tim" }, { "Rahul", "Siva" }, { "Anshul", "Gary" }, { "Anshul", "Azhar" }, { "Lok", "Vamsi" } }; // Overloading of Output Operator ostream& operator<<(ostream& o, const tab_t& t) { // Iterate through the table t for (size_t i = 0; i < t.size(); ++i) { o << i << ":"; for (const auto& e : t[i]) o << '\t' << e; o << endl; } return o; } // Function that perform join operation // on the two tables tab_t Join(const tab_t& a, size_t columna, const tab_t& b, size_t columnb) { unordered_multimap<string, size_t> hashmap; // Use of Hashmap for (size_t i = 0; i < a.size(); ++i) { hashmap.insert({ a[i][columna], i }); } // Perform Mapping tab_t result; for (size_t i = 0; i < b.size(); ++i) { auto range = hashmap.equal_range( b[i][columnb]); // Create new joined table for (auto it = range.first; it != range.second; ++it) { tab_t::value_type row; // Insert values to row row.insert(row.end(), a[it->second].begin(), a[it->second].end()); row.insert(row.end(), b[i].begin(), b[i].end()); // Push the row result.push_back(move(row)); } } return result; } // Driver Code int main(int argc, char const* argv[]) { int ret = 0; // Given Tables cout << "Table A: " << endl << tab1 << endl; cout << "Table B: " << endl << tab2 << endl; // Function Call auto tab3 = Join(tab1, 1, tab2, 0); // Print the joined table cout << "Joined tables: " << endl << tab3 << endl; return ret; }
Python3
# Python program for hashjoin on two tables from collections import defaultdict # Function that perform join operation # on the two tables def hashJoin(table1, index1, table2, index2): h = defaultdict(list) # Hash for s in table1: h[s[index1]].append(s) # Perform join operation return [(s, r) for r in table2 for s in h[r[index2]]] # Driver Code # Given two tables table1 = [("32", "Rahul"), ("25", "Anshul"), ("17", "Lok"), ("25", "Akil"), ("17", "Anshul")] table2 = [("Rahul", "Tim"), ("Rahul", "Siva"), ("Anshul", "Gary"), ("Anshul", "Azhar"), ("Lok", "Vamsi")] # Print the resultant table for row in hashJoin(table1, 1, table2, 0): print(row)
Table A: 0: 32 Rahul 1: 25 Anshul 2: 17 Lok 3: 25 Akil 4: 17 Anshul Table B: 0: Rahul Tim 1: Rahul Siva 2: Anshul Gary 3: Anshul Azhar 4: Lok Vamsi Joined tables: 0: 32 Rahul Rahul Tim 1: 32 Rahul Rahul Siva 2: 17 Anshul Anshul Gary 3: 25 Anshul Anshul Gary 4: 17 Anshul Anshul Azhar 5: 25 Anshul Anshul Azhar 6: 17 Lok Lok Vamsi
Publicación traducida automáticamente
Artículo escrito por akshayvarma72 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA