SQL лучшая альтернатива операторам LEFT JOIN и WHERE? - PullRequest
0 голосов
/ 21 мая 2018

В основном у меня есть две таблицы.Таблица клиентов и покупок.Моя проблема в том, что Таблица покупок очень велика и вызывает проблемы с производительностью, и я пытаюсь систематизировать свой код в соответствующие 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, но это приведет к тому, что мой код будетнеорганизованные и, возможно, некоторые проблемы с производительностью.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Это может сделать это

SELECT rc.Custid, p.GuitarType, p.PurchaseDate
  FROM RelevantCustomers rc 
  LEFT JOIN Purchases p 
    ON p.CustId = rc.CustId
  LEFT JOIN Purchases pn 
    ON pn.CustId = rc.CustId 
   AND p.GuitarType != 'A'
 WHERE (p.GuitarType = 'A' OR p.CustID IS NULL)  
   and  pn.CustID is null
0 голосов
/ 21 мая 2018

Похоже, вы хотите:

SELECT rc.Custid, p.GuitarType, p.PurchaseDate
FROM RelevantCustomers rc LEFT JOIN
     Purchases p 
    ON p.CustId = rc.CustId
WHERE p.GuitarType = 'A' OR p.GuitarType IS NULL;

Для производительности вам нужен индекс на Purchases(CustId).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...