Hash join: Difference between revisions

Content added Content deleted
(Ruby restored because it was overwritten by mistake.)
Line 1,692: Line 1,692:
28 | Alan || Alan | Ghosts
28 | Alan || Alan | Ghosts
28 | Glory || Glory | Buffy
28 | Glory || Glory | Buffy
</pre>

=={{header|Ruby}}==
<lang ruby>def hashJoin(table1, index1, table2, index2)
# hash phase
h = table1.group_by {|s| s[index1]}
h.default = []
# join phase
table2.collect {|r|
h[r[index2]].collect {|s| [s, r]}
}.flatten(1)
end

table1 = [[27, "Jonah"],
[18, "Alan"],
[28, "Glory"],
[18, "Popeye"],
[28, "Alan"]]
table2 = [["Jonah", "Whales"],
["Jonah", "Spiders"],
["Alan", "Ghosts"],
["Alan", "Zombies"],
["Glory", "Buffy"]]

hashJoin(table1, 1, table2, 0).each { |row| p row }</lang>

{{out}}
<pre>
[[27, "Jonah"], ["Jonah", "Whales"]]
[[27, "Jonah"], ["Jonah", "Spiders"]]
[[18, "Alan"], ["Alan", "Ghosts"]]
[[28, "Alan"], ["Alan", "Ghosts"]]
[[18, "Alan"], ["Alan", "Zombies"]]
[[28, "Alan"], ["Alan", "Zombies"]]
[[28, "Glory"], ["Glory", "Buffy"]]
</pre>
</pre>