.

iT邦幫忙

0

SQL 多重方法比對 Join

  • 分享至 

  • xImage

親愛的IT神人,小弟自學只會很基礎的SQL 語法,目前遇到以下難題

一筆資料訂單
另一筆是比對用表格,我希望能透過SQL 資料比對
https://ithelp.ithome.com.tw/upload/images/20250113/20171448J9oVUeOy0N.png

https://ithelp.ithome.com.tw/upload/images/20250113/201714482QOolYW8Ku.png

透過比對表 來找出 訂單報表中最右邊那欄的結果

主要是各欄位都有些不規則

  1. 訂單報表的ID會是單一的,但比對表的ID包含是會包含多個ID對相同結果,並且有,代表任何ID都可以
  2. ID排除同樣也是多對一
  3. 參數包含:比對表中的參數包含,都是短的Text, 而訂單報表中的參數則是長串,只要訂單報表中的參數Text contain任何比對表中的參數包含就會符合比對
  4. 參數排除:與參數包含相反,訂單報表中的參數,只要有被包含在參數排除內就算符合
  5. 比對表中的ID排除參數排除為空值,代表無特定排除
  6. 比對表中的參數包含則代表任何參數都可以
  7. 訂單報表中的參數,則有空值、長度不一的無規律各種Text值

之前在Excel是用布林值比對一列一列往下比對所有項目都符合
目前轉移到SQL我是本來是使用Like+'%'的查找方式搭配Left Join
目前是用

From 訂單報表 left join 比對表
On ID包含 like %ID%
and ID排除 not like %ID%

但是ID 包含的"全"ID不知道該怎麼處理

謝謝

尼克 iT邦大師 1 級 ‧ 2025-01-13 22:14:20 檢舉
看不懂你的問題
你先把 訂單報表 跟 比對表 弄成文字的初始資料吧..

資料表:訂單報表
欄位:ID、參數

資料表:比對表
欄位:比對結果名稱、ID包含、ID排除、參數包含、參數排除
.
圖片
  直播研討會

2 個回答

0
Zero皇
iT邦研究生 2 級 ‧ 2025-01-13 21:21:06

感覺你是想要下面這樣?

From 訂單報表 left join 比對表
On (ID包含 like %ID% or ID包含 = "全")
and ID排除 not like %ID%

如果可以給完整一點的SQL(like那段),可能會更看得懂一點

0
walljack1
iT邦新手 5 級 ‧ 2025-01-15 19:56:05

WITH RECURSIVE numbers AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1
    FROM numbers
    WHERE n <= 10
)
SELECT 
    訂單報表.ID AS 訂單ID,
    訂單報表.參數,
    訂單報表.比對結果,
    比對表.ID包含,
    比對表.比對合併,
    比對表.參數名稱
FROM 
    比對表
LEFT JOIN 
    訂單報表
ON 
    (
        比對表.ID包含 = '全' OR 
        EXISTS (
            SELECT 1
            FROM (
                SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(比對表.ID包含, ':', n), ':', -1)) AS single_id
                FROM numbers
            ) AS split_ids
            WHERE 訂單報表.ID LIKE CONCAT('%', split_ids.single_id, '%')
        )
    )
    AND 
    (比對表.ID排除 IS NULL OR 訂單報表.ID NOT LIKE CONCAT('%', 比對表.ID排除, '%'));

你說的是這樣嗎?

我要發表回答

立即登入回答