SQL Соединение сервера влево по двум параметрам, не возвращая не найденный в таблице B - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть две таблицы: «addToCart» и «order2»:

addToCart - пользователи, которые добавили продукт в корзину

заказ - пользователи, которые купили продукт

В обеих таблицах у меня также есть категория продукта.

AddToCart

UserID   ProductCategory   Date
-----------------------------------
001id    ProductCategory1  02/24/2020 10:00 AM
001id    ProductCategory2  02/24/2020 11:00 AM
001id    ProductCategory2  02/24/2020 11:40 AM
001id    ProductCategory3  02/24/2020 12:40 PM

Order2

UserID   ProductCategory   Date
-----------------------------------
001id    ProductCategory1  02/24/2020 11:00 AM
001id    ProductCategory2  02/24/2020 11:30 AM

Мне нужно чтобы получить пользователей, которые отказались от корзины в каждой категории товаров. Чтобы добиться этого, я смотрю на пользователей, которые добавили в корзину, а не сгенерировали заказ или последняя addToCart для одной ProductCategory старше, чем заказ для той же ProductCategory.

Итак, каждый день я запускаю этот запрос:

select 
  added.UserID,
  added.ProductCategory,
  max(added.[Date]) as addedDate
from addTocart added
left join order2 ord
on added.UserID = ord.UserID
  and added.ProductCategory = ord.ProductCategory
group by added.UserID, added.ProductCategory
having max(added.[Date]) > max(ord.[Date])

Насколько я знаю, если я сделаю левое соединение между таблицей A и таблицей B (on A.id = B.id), я могу вывести строки из таблицы A, которые не имеют совпадений в таблице B.

Но когда я запускаю этот запрос с двумя параметрами в предложении on, id001 для ProductCategory3 не возвращается. Может ли кто-нибудь помочь определить, почему и почему я могу вернуть контакты, которые добавили в корзину какую-либо товарную категорию, но не заказали эту товарную категорию?

1 Ответ

0 голосов
/ 26 февраля 2020

Привет!

В настоящий момент у меня нет сервера, но, возможно, у "имеющего" может быть что-то вроде этого:

having max(added.[Date]) > max(ord.[Date]) or IsNull(ord.[Date])

PS Я делаю не знаю семантику вашего разработанного запроса, но похоже, что проблема в этом предложении.

...