Используйте CROSS JOIN и LEFT OUTER JOIN (это из моего опыта работы с MS SQL, но концепция должна выполняться).
Это работает так. Подзапрос получает все возможные комбинации пользователя и виджета.
LEFT OUTER JOIN объединяет ваши ассоциации User_Widgets.
Часть IS NULL WHERE CLAUSE исключит виджеты, которые есть у пользователя, предоставляя вам только те, которые не имеют.
SELECT allpossible.User_ID, allpossible.Widget_ID FROM
(
SELECT User_ID, Widget_ID FROM
Users
CROSS JOIN
Widgets
) allpossible
LEFT OUTER JOIN
User_Widgets uw
ON
allpossible.User_ID = uw.User_ID
AND allpossible.Widget_ID = uw.Widget_ID
WHERE
uw.UserID IS NULL