SQL-запрос для достижения некоторого типа левого / правого соединения с дополнительным условием - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю с MS Navision и имею следующую ситуацию.

2 таблицы, как на рисунке ниже, и мне нужно получить результат, который вы видите ниже как «Желаемый».Это необходимо для того, чтобы идентифицировать строки со значениями NULL и представить их в отчете:

TABLE1

+---------+-------+  
| Cluster | OGE   |  
+---------+-------+  
| B1309   | A     |  
| B1309   | B     |  
+---------+-------+  

Table2

+--------+---------+-----+  
|  Type  | Cluster | OGE |  
+--------+---------+-----+  
| Liniar | B1309   | A   |  
| 44     | B1309   | A   |  
| 44     | B1309   | B   |  
+--------+---------+-----+ 

Desired

+---------+-----+---------+---------+--------+  
| Cluster | OGE |  Type   | Cluster | OGE    |  
+---------+-----+---------+---------+--------+  
| B1309   | A   | Liniar  | B1309   | A      |  
| B1309   | B   | Liniar  | NULL    | NULL   |  
| B1309   | A   | 44      | B1309   | A      |  
| B1309   | B   | 44      | B1309   | B      |  
+---------+-----+---------+---------+--------+  

Это необходимо для определения , какие записи из Таблицы1 не имеют соответствующей записи в Таблице 2 для каждого Типа

Мои таблицы могут иметь тысячи строк, поэтомуВот почему я хочу найти способ идентифицировать это эффективным способом, без зацикливания бросать каждую строку ..

Вы знаете, по крайней мере, как что-то подобное достигается в SQL Server или языке программирования, может быть, яможно реализовать логику в NAV?

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Используйте cross join для генерации строк и left join для ввода значений, которые соответствуют:

select og.cluster, og.OGE, t.type,
       t2.cluster, t2.OGE
from table1 og cross join
     (select distinct type form table2) t left join
     table2 t2
     on t2.cluster = og.cluster and
        t2.OGE = og.OGE and
        t2.type = t.type;
0 голосов
/ 22 февраля 2019

Это делает трюк:

SELECT tmp.*, t2.*
FROM (SELECT * FROM Table1 t1a, (SELECT DISTINCT [Type] FROM Table2) t2a) tmp 
    LEFT JOIN Table2 t2 ON (tmp.Cluster = t2.Cluster AND tmp.OGE = t2.OGE AND tmp.Type = t2.Type)

И затем только результаты, которые вам нужны:

SELECT tmp.*
FROM (SELECT * FROM Table1 t1a, (SELECT DISTINCT [Type] FROM Table2) t2a) tmp 
    LEFT JOIN Table2 t2 ON (tmp.Cluster = t2.Cluster AND tmp.OGE = t2.OGE AND tmp.Type = t2.Type)
WHERE t2.Cluster IS NULL

первый (неправильный) ответ

Желаемое, кажется, нечто иное, чем то, что вы показываете в Desired-таблице?Похоже, что следующий запрос будет делать:

SELECT Table1.Cluster 
FROM Table1 
    LEFT JOIN Table2 ON (Table1.Cluster = Table2.Cluster AND Table1.OGE = Table2.OGE)
WHERE Table2.Cluster IS NULL
...