Hash join: Difference between revisions

Content added Content deleted
Line 219: Line 219:
Age: 28, Name: Alan, Nemesis: Ghosts
Age: 28, Name: Alan, Nemesis: Ghosts
Age: 28, Name: Alan, Nemesis: Zombies
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>
</pre>