Как получить несуществующие строки во многих отношениях - PullRequest
1 голос
/ 22 января 2020

У меня следующие три таблицы

продукты

------------------
|  id | name     |
------------------
|  1  | Ariel    |
|  2  | Milk     |
------------------

прайс-лист

-----------------------
|  id | name          |
-----------------------
|  1  | Trade Price   |
|  2  | Net Price     |
|  3  | Retail Price  |
-----------------------

product_prices

(в нем только две записи для продукта 'Ariel')
----------------------------------------------
|  id | product_id | price_list_id  | price  |
----------------------------------------------
|  1  |     1      |       1        |   100  |
|  2  |     1      |       2        |   110  |
----------------------------------------------

Желаемый результат:

------------------------------------------------------------
|  id | product_name |                prices               |
------------------------------------------------------------
|     |              |  | id | price_list_name | price |   |
|  1  |     Ariel    |  --------------------------------   |
|     |              |  | 1  |  Trade Price    |  100  |   |
|     |              |  | 2  |  Net Price      |  110  |   |
|     |              |  | 3  |  Retail Price   |  null |   |
|     |              |  --------------------------------   |
|     |              |  | id | price_list_name | price |   |
|  2  |     Milk     |  --------------------------------   |
|     |              |  | 1  |  Trade Price    |  null |   |
|     |              |  | 2  |  Net Price      |  null |   |
|     |              |  | 3  |  Retail Price   |  null |   |
                        --------------------------------   |
------------------------------------------------------------

Я пытался выполнить следующий запрос, чтобы получить перекрестные значения между продуктами и прайс-листом

SELECT p.id, 
       p.NAME, 
       pl.id, 
       pl.NAME 
FROM   products p 
       CROSS JOIN price_list pl 
WHERE  pl.id NOT IN (SELECT product_id 
                     FROM   product_prices)

Любая идея, как достичь желаемого результата?

1 Ответ

2 голосов
/ 22 января 2020

Я думаю, что-то вроде этого. Я изменил названия полей и таблиц для краткости. Я также отображаю все поля.

select * from t1 cross join t2 left join t3 on t1.id = t3.t1_id and t2.id = t3.t2_id order by t1.id, t2.id;

+----+-------+----+--------------+------+-------+-------+-------+
| id | name  | id | name         | id   | t1_id | t2_id | price |
+----+-------+----+--------------+------+-------+-------+-------+
|  1 | Ariel |  1 | Trade Price  |    1 |     1 |     1 |   100 |
|  1 | Ariel |  2 | Net Price    |    2 |     1 |     2 |   110 |
|  1 | Ariel |  3 | Retail Price | NULL |  NULL |  NULL |  NULL |
|  2 | Milk  |  1 | Trade Price  | NULL |  NULL |  NULL |  NULL |
|  2 | Milk  |  2 | Net Price    | NULL |  NULL |  NULL |  NULL |
|  2 | Milk  |  3 | Retail Price | NULL |  NULL |  NULL |  NULL |
+----+-------+----+--------------+------+-------+-------+-------+
  • продукты -> t1
  • прайс-лист -> t2
  • product_prices -> t3
...