В основном у меня есть две таблицы.Таблица клиентов и покупок.Моя проблема в том, что Таблица покупок очень велика и вызывает проблемы с производительностью, и я пытаюсь систематизировать свой код в соответствующие CTE.
Я пытаюсь получить все записи о покупках для тех, кто приобрел гитаруВведите A или не совершайте покупок.
Я хочу отфильтровать любого покупателя, который не купил GuitarType A , но при этом сохранил клиента, который ничего не купил.
Вот мой код:
WITH Purchases AS
(
SELECT
, CustID
, GuitarType
FROM
Purchase
WHERE
GuitarType = 'A'
)
,
RelevantCustomers AS
(
SELECT
P.Custid
, P.PurchaseDate
, C.CustType
FROM
Customer
)
SELECT
Custid
, GuitarType
, PurchaseDate
FROM
Purchases AS p
INNER JOIN
RelevantCustomers AS rc ON p.CustId= rc.CustId
Клиент:
+--------+-------------+----------+
| CustId | CreatedDate | CustType |
+--------+-------------+----------+
| 1 | 01/01/2017 | A |
+--------+-------------+----------+
| 2 | 01/01/2018 | B |
+--------+-------------+----------+
| 4 | 01/01/2018 | C |
+--------+-------------+----------+
Покупка
+----------+--------------+------------+
| GuitarId | PurchaseDate | GuitarType |
+----------+--------------+------------+
| 1 | 04/01/2018 | A |
+----------+--------------+------------+
| 1 | 05/01/2018 | A |
+----------+--------------+------------+
| 1 | 06/01/2018 | C |
+----------+--------------+------------+
| 2 | 06/01/2018 | A |
+----------+--------------+------------+
| 2 | 06/01/2018 | B |
+----------+--------------+------------+
| 2 | 06/01/2018 | A |
+----------+--------------+------------+
Если я использую INNER JOIN, то вернутся только те, кто купил Guitar TypeО. Если я использую ЛЕВУЮ, тогда в нее войдут все Клиенты.
Одна альтернатива - переместить «Where GuitarType = 'A' вниз к предложению where и выполнить LEFT JOIN, но это приведет к тому, что мой код будетнеорганизованные и, возможно, некоторые проблемы с производительностью.