Hash join: Difference between revisions

1,036 bytes added ,  9 years ago
Line 219:
Age: 28, Name: Alan, Nemesis: Ghosts
Age: 28, Name: Alan, Nemesis: Zombies
</pre>
 
=={{header|Clojure}}==
<lang clojure>
(defn hash-join [table1 col1 table2 col2]
(let [hashed (group-by col1 table1)]
(flatten
(for [r table2]
(for [s (hashed (col2 r))]
(merge s r))))))
</lang>
 
Sample run:
<lang clojure>
(def s '({:age 27 :name "Jonah"}
{:age 18 :name "Alan"}
{:age 28 :name "Glory"}
{:age 18 :name "Popeye"}
{:age 28 :name "Alan"}))
 
(def r '({:nemesis "Whales" :name "Jonah"}
{:nemesis "Spiders" :name "Jonah"}
{:nemesis "Ghosts" :name "Alan"}
{:nemesis "Zombies" :name "Alan"}
{:nemesis "Buffy" :name "Glory"}))
 
(pprint (sort-by :name (hash-join s :name r :name)))
</lang>
 
Produces:
<pre>
({:nemesis "Ghosts", :age 18, :name "Alan"}
{:nemesis "Ghosts", :age 28, :name "Alan"}
{:nemesis "Zombies", :age 18, :name "Alan"}
{:nemesis "Zombies", :age 28, :name "Alan"}
{:nemesis "Buffy", :age 28, :name "Glory"}
{:nemesis "Whales", :age 27, :name "Jonah"}
{:nemesis "Spiders", :age 27, :name "Jonah"})
</pre>
 
Anonymous user