You generate a daily report according to the following query:
You need to improve the performance of the query.
What should you do?
A.
 Drop the UDF and rewrite the report query as follows: 
WITH cte(CustomerID, LastOrderDate) AS ( 
SELECT CustomerID, MAX(OrderDate) AS [LastOrderDate] 
FROM Sales.SalesOrder 
GROUP BY CustomerID 
) 
SELECT c.CustomerName 
FROM cte 
INNER JOIN Sales.Customer c 
ON cte.CustomerID = c.CustomerID 
WHERE cte.LastOrderDate < DATEADD(DAY, -90, GETDATE())
B.
 Drop the UDF and rewrite the report query as follows: 
SELECT c.CustomerName 
FROM Sales.Customer c 
WHERE NOT EXISTS ( 
SELECT s.OrderDate 
FROM Sales.SalesOrder 
WHERE s.OrderDate > DATEADD(DAY, -90, GETDATE()) 
AND s.CustomerID = c.CustomerID)
C.
 Drop the UDF and rewrite the report query as follows: 
SELECT DISTINCT c.CustomerName 
FROM Sales.Customer c 
INNER JOIN Sales.SalesOrder s 
ON c.CustomerID = s.CustomerID 
WHERE s.OrderDate < DATEADD(DAY, -90, GETDATE())
D.
 Rewrite the report query as follows: 
SELECT c.CustomerName 
FROM Sales.Customer c 
WHERE NOT EXISTS (SELECT OrderDate FROM Sales.ufnGetRecentOrders(c.CustomerID, 
90)) 
Rewrite the UDF as follows: 
CREATE FUNCTION Sales.ufnGetRecentOrders(@CustomerID int, @MaxAge datetime) 
RETURNS TABLE AS RETURN ( 
SELECT OrderDate 
FROM Sales.SalesOrder 
WHERE s.CustomerID = @CustomerID 
AND s.OrderDate > DATEADD(DAY, -@MaxAge, GETDATE())

Can anyone explain why A is faster?
After reading http://www.sql-server-performance.com/2015/common-table-expressions-cte-developers/ I think [but I dont know ;)] A is correct.
The difference between this question and the web-link (->Finding Duplicates) is minimal, in both cases you have to find one dataset in another dataset.
?
b