\begin{frame}
\frametitle{Avoid Unnecessary Duplicate Elimination}
\begin{goal}{Sufficient condition for superfluous \sql{distinct}}
Assumption: \sql{where} clause is a conjunction (\sql{and}).
\begin{enumerate}
\medskip
\item
Let $\mathcal{K}$ be the set of attributes in the \sql{select} clause.
\medskip
\item If $A~\sql{=}~c$ in the \sql{where} clause and $c$ a constant, add $A$ to $\mathcal{K}$.
\item If $A~\sql{=}~B$ in the \sql{where} clause and $B \in \mathcal{K}$, add $A$ to $\mathcal{K}$.
\item If $\mathcal{K}$ has a key of a variable $X$, add all attributes of $X$ to $\mathcal{K}$.
\medskip
\item Repeat 2, 3 and 4 until $\mathcal{K}$ is stable.
\medskip
\end{enumerate}
If $\mathcal{K}$ \emph{contains a key of every tuple variable}
listed under \sql{from}, then \sql{distinct} is superfluous.
\end{goal}
\smallskip
Intuition behind the algorithm: think of $\mathcal{K}$ as the
set of attributes that are uniquely determined by the result.
\end{frame}