Как создать это право присоединиться - PullRequest
0 голосов
/ 26 ноября 2018

Мне нужно создать представление, и я ставлю для всех транзакций, мне нужно связать все операции.Если в TransactionOperation отсутствует операция, мне нужно добавить результат.

Transaction( transaction id,transaction_name)

Operation(id_operation,operation_name);

TransactionOperatation(id_transaction,id_operation); // represents all transaction to be used

Таким образом, представление выглядит так:

Create view title AS select
t.id_transaction as id_transaction,
t.name_transaction as name_transaction,
o.id_operation as id_operation,
o.name_operation as name_operation,

from ((TransactionOperation to 
inner join transaction t on t.id_transaction=to.id_transaction)
rigth join operation o on o.id_operation=to.id_operation

Проблема в том, что партнер не работает какЯ хочу этоЭто должен быть результат, например:

Operation id_operation operation_name
           1            test
           2            home
transaction id_transaction  transaction_name
               1              scope
               2              pool

TransactionOperation id_operation operation_name id_transaction transaction name:
                         1            test          1             scope     
                         1            test          2             pool

В этом примере мне нужно получить для каждой транзакции все операции.Операция с id = 2 не отображается в TransactionOperation, но должна появиться в результате.Результат, который я хочу, это

id_operation operation_name id_transaction transaction name:
   1            test          1              scope
   2            home          1              scope
   1            test          2              pool
   2            home          2              pool             

Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Вы пытаетесь получить все возможные комбинации между transaction и operation, несмотря на то, что в таблице соединений не определено отношение между ними.Этого можно достичь, используя декартово произведение (CROSS JOIN) между значениями Unique двух таблиц:

CREATE VIEW title AS
SELECT
  t.*, o.*
FROM 
  (SELECT DISTINCT id_transaction, transaction_name FROM transaction) AS t
CROSS JOIN
  (SELECT DISTINCT id_operation, operation_name FROM operation) AS o 
0 голосов
/ 26 ноября 2018

Вы, похоже, просто хотите cross join:

select o.id_operation, o.operation_name, t.id_transaction, t.transaction_name
from Transaction t cross join
     Operation o;

Нет необходимости в подзапросах или других типах join s.

0 голосов
/ 26 ноября 2018

Я бы присоединился, начиная с соединительной таблицы TransactionOperation, затем оставил объединение с двумя другими таблицами:

CREATE VIEW title AS
SELECT
    COALESCE(t.id_transaction, 'NA')   AS id_transaction,
    COALESCE(t.name_transaction, 'NA') AS name_transaction,
    COALESCE(o.id_operation, 'NA')     AS id_operation,
    COALESCE(o.name_operation, 'NA')   AS name_operation
FROM TransactionOperation to
LEFT JOIN transaction t
    ON t.id_transaction = to.id_transaction
LEFT JOIN operation o
    ON o.id_operation = to.id_operation

Проблема с вашим текущим подходом заключается в том, что используется внутреннее соединение между соединениемстол и стол transaction.Это означает, что любые записи о соединениях, которые не присоединяются к чему-либо в таблице transaction, будут отброшены до того, как у них появится возможность присоединиться к чему-либо в таблице operation.Использование левых объединений позволяет обойти эту проблему.

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