簡體   English   中英

比較 SQL Server 中 2 個不同表的父子組合

[英]Comparing Parent-child combination from 2 different tables in SQL Server

我有表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      |
+--------+----------+----------+

基本上, MAT_REL具有空PARENT的行被視為 TOP Parent 並且它的孩子將被視為PARENT以供我在MAT_REL進行比較。 MAT_REL也可能包含 Parent 作為其他值(例如,A_STEEL、B_CARBON 等),我並不擔心。 我正在考慮比較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_ITEMMAT_REL是否MAT_ITEM組合中的MAT_NO & CHILDMAT_NOPARENT & CHILDMAT_REL相同。 MAT_REL正在嘗試獲取不匹配的行。 我們不能直接比較MAT_ITEMMAT_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

但不確定如何處理整套組合。

根據對問題的評論回答。 我在 SQLite 數據庫上進行了嘗試,由於與 SQLServer 相比語法可能有所不同,因此我只能給您指示。 我沒有到數據庫的鏈接。

尋找基礎:

  1. 在 mat_rel 中找到 mat_no, child 對,其中 parent 為 NULL
  2. 查找 mat_rel 中與 mat_no 匹配且父級與 1 中的子級匹配的所有行。在類似 (SELECT ..) 的 JOIN 中添加來自 1. 的 SQL。

查找不匹配(比較 child=child 和 mat_no=mat_no):

  1. 查找 2 中的所有行,其中 mat_item 中沒有匹配的行。 使用 LEFT JOIN 或 NOT EXISTS
  2. 查找 mat_item 中 mat_rel 中沒有匹配行的所有行 2. 使用 RIGHT JOIN 或 NOT EXISTS。

找到 3 和 4:

  1. 將兩個 SQL 與 UNION ALL 一起使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM