Сравнение родительско-дочерней комбинации из 2 разных таблиц на сервере SQL - PullRequest
0 голосов
/ 14 января 2020

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

+--------+-------+
| MAT_NO | CHILD |
+--------+-------+
| 9856   | 874   |
| 9856   | 856   |
| 9856   | 548   |
| 9883   | 596   |
| 9883   | 356   |
| 7845   | 101   |
| 7845   | 908   |
| 7845   | 206   |
+--------+-------+

Другая таблица MAT_REL и следующие данные:

+--------+----------+----------+
| MAT_NO | PARENT   | CHILD    |
+--------+----------+----------+
| 9856   |          | STEEL    |
| 9856   | STEEL    | 874      |
| 9856   | STEEL    | 856      |
| 9856   | STEEL    | 548      |
| 9856   | A-STEEL  | 874      |
| 9856   | B_STEEL  | 856      |
| 7845   |          | METAL    |
| 7845   | O_METAL  | 102      |
| 7845   | I_METAL  | 908      |
| 7845   | METAL    | 102      |
| 7845   | METAL    | 908      |
| 7845   | METAL    | 206      |
| 7845   | METAL    | 769      |
| 9883   |          | CARBON   |
| 9883   | B_CARBON | 596      |
| 9883   | C_CARBON | 356      |
| 9883   | CARBON   | 596      |
| 9883   | CARBON   | 147      |
+--------+----------+----------+

В основном строка с пустым PARENT в MAT_REL считается TOP Parent, а его ребенок будет считаться PARENT для моего сравнения в MAT_REL. MAT_REL может содержать Parent в качестве других значений ( например, A_STEEL, B_CARBON et c., ), о которых я не беспокоюсь. Нечто подобное в MAT_REL - это то, что я рассматриваю для сравнения.

+--------+--------+-------+
| MAT_NO | PARENT | CHILD |
+--------+--------+-------+
| 9856   | STEEL  | 874   |
| 9856   | STEEL  | 856   |
| 9856   | STEEL  | 548   |
| 9883   | CARBON | 596   |
| 9883   | CARBON | 147   |
| 7845   | METAL  | 102   |
| 7845   | METAL  | 908   |
| 7845   | METAL  | 206   |
| 7845   | METAL  | 769   |
+--------+--------+-------+

Теперь я хочу сравнить MAT_ITEM и MAT_REL, совпадает ли комбинация MAT_NO & CHILD в MAT_ITEM с MAT_NO, PARENT & CHILD in MAT_REL. Я пытаюсь получить несовпадающие строки. Мы не можем напрямую сравнивать MAT_ITEM и MAT_REL. Прямое сравнение не будет работать, потому что, если вы посмотрите на MAT_NO 9883, прямое сравнение может дать результат, так как строки одинаковы, но мы должны проверить для CARBON, а не для других (B_CARBON) в целом

Ожидаемый результат: (с ребенком или без него)

9883
7845

Я могу получить детали для одного MAT_NO.

SELECT * FROM MAT_ITEM WHERE MAT_NO='7845' 

SELECT * FROM MAT_REL 
WHERE MAT_NO = '7845' AND PARENT IS NULL -- METAL (using this below)

SELECT * FROM MAT_REL 
WHERE MAT_NO = '7845' AND PARENT = 'METAL' 


SELECT DISTINCT CHILD FROM MAT_ITEM WHERE MAT_NO = '7845' 
EXCEPT
SELECT DISTINCT CHILD FROM MAT_REL 
WHERE MAT_NO = '7845' AND PARENT = 'METAL' -- will return some rows --101

, но не знаю, как это сделать для всего набора комбинаций.

1 Ответ

0 голосов
/ 16 января 2020

Ответ в соответствии с комментариями к вопросу. Я опробовал его на базе данных SQLite, и поскольку синтаксис может быть отключен по сравнению с SQLServer, я могу только дать вам указания. У меня нет ссылки на базу данных.

Поиск основ:

  1. Найдите mat_no, дочернюю пару в mat_rel, где родитель IS NULL
  2. Найти все строки в mat_rel, который совпадает с mat_no и где родитель соответствует дочернему элементу из 1. Добавьте SQL из 1. в JOIN-подобном (SELECT ..).

Нахождение несоответствия (сравнение child = child и mat_no = mat_no):

Найти все строки из 2, где в mat_item нет подходящей строки. Используйте левое соединение или не существует Найдите все строки в mat_item, где в mat_rel нет совпадающих строк из 2. Используйте прямое соединение или не существует.

Поиск 3 и 4 :

Используйте оба SQL с UNION ALL
...