Как я могу получить только продукты, которые были заменены ровно 3 раза? - PullRequest
0 голосов
/ 21 октября 2019

У меня возникли проблемы с разработкой того, как написать запрос, который будет возвращать мне только строки для продукта, в котором он был заменен ровно 3 раза.

Я добавил биты V1, V2, V3текст, чтобы помочь объяснить проблему, поэтому я не могу просто сделать «Содержит» V3, поскольку этого не существует.

Вот моя таблица данных:

+-----------+--------------+--------------+
| ProductId | SupersededBy | Name         |
+-----------+--------------+--------------+
| 123456    | 789012       | Car Wheel V1 |
| 789012    | 345678       | Car Wheel V2 |
| 345678    | null         | Car Wheel V3 |
| 901234    | 112233       | Brake Pad V1 |
| 567890    | 778899       | Mirror V1    |
| 112233    | null         | Brake Pad V2 |
| 445566    | null         | Mirror V3    |
| 778899    | 445566       | Mirror V2    |
| 113366    | 224477       | Motor V1     |
| 224477    | 335588       | Motor V2     |
| 335588    | 990011       | Motor V3     |
| 990011    | null         | Motor V4     |
+-----------+--------------+--------------+

Ожидаемый результат:

+-----------+--------------+--------------+
| ProductId | SupersededBy | Name         |
+-----------+--------------+--------------+
| 345678    | null         | Car Wheel V3 |
| 445566    | null         | Mirror V3    |
+-----------+--------------+--------------+

1 Ответ

1 голос
/ 21 октября 2019

Вы можете сделать это, используя join s, чтобы точно следовать за цепочкой дважды (чтобы получить три продукта):

select t.ProductId, t2.ProductId, t3.ProductId
from t t1.join
     t t2
     on t2.SupersededBy = t1.ProductId join
     t t3
     on t3.SupersededBy = t2.ProductId
where t3.SupersededBy is null and
      not exists (select 1
                  from t t2
                  where t2.SupersededBy = t1.ProductId
                 );

not exists должен быть уверен, что вы начинаете с первого продукта.

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