我有這樣的表:
表格1:
| 名稱 | ID1 | FID |
|---|---|---|
| 面包 | XYZ | 18面包 |
| 魚 | 美國廣播公司 | 45魚 |
| BREAD_OLD | BNQ | 18BREAD_OLD |
| 熏肉 | TBG | 77培根 |
| 蛋 | 中國地質調查局 | 99個雞蛋 |
| 香蕉 | BHG | 香蕉18 |
表2:
| 名稱 | FID |
|---|---|
| 面包 | 18 |
| 魚 | 45 |
| 熏肉 | 77 |
| 蛋 | 99 |
目前在表 1 上進行了簡單的搜索以查找食物的 id,如下所示:
SELECT ID1
FROM TABLE1
WHERE NAME IN NAME_LIST
例如,當名稱串列為: ('BREAD','FISH') 時,它會回傳 XYZ、ABC。問題是這錯過了“BREAD_OLD”,它是具有相同 ID 的舊版本。(18)
我需要更改此設定,因此現在搜索是基于食物的 FID 而不是名稱來查找受影響的食物,但我無法更改輸入。
例如:給定食物清單:('BREAD','FISH')
結果應該是 XYZ、ABC、BNQ(因為 BREAD 匹配 18 匹配表 1 中的 BNQ)
這怎么能做到?我想我需要使用連接或“在選擇中選擇”,但我不確定這將如何與多個輸入一起作業。
編輯:ORACLE是資料庫編輯2:將BANANA18添加到表1,需要領先匹配
uj5u.com熱心網友回復:
正確的解決方案是鏈接 FID 欄位。但是,table1 上的 FID 欄位似乎將 ID 與名稱連接起來。因此,解決方案是從該欄位中提取數值,然后使用該數值將其鏈接到表 2 上的 FID 欄位。例如:
SELECT t1.FNAME, t1.ID1
FROM table1 t1
INNER JOIN table2 t2 ON t2.FID = regexp_replace(t1.FID, '^[^0-9]', '')
WHERE
t2.FNAME IN ('BREAD','FISH');
uj5u.com熱心網友回復:
假設table1.FID等于table2.FID與 then 連接,table1.FNAME您不需要(慢)正則運算式,并且可以使用簡單的等式與字串連接:
SELECT t1.FNAME,
t1.ID1
FROM table1 t1
INNER JOIN table2 t2
ON t1.FID = t2.fid || t1.fname
WHERE t2.FNAME IN ('BREAD','FISH');
其中,對于樣本資料:
CREATE TABLE table1 (FNAME, ID1, FID) AS
SELECT 'BREAD', 'XYZ', '18BREAD' FROM DUAL UNION ALL
SELECT 'FISH', 'ABC', '45FISH' FROM DUAL UNION ALL
SELECT 'BREAD_OLD', 'BNQ', '18BREAD_OLD' FROM DUAL UNION ALL
SELECT 'BACON', 'TBG', '77BACON' FROM DUAL UNION ALL
SELECT 'EGGS', 'CGS', '99EGGS' FROM DUAL UNION ALL
SELECT 'BANANA', 'BHG', 'BANANA18' FROM DUAL UNION ALL
SELECT 'TOAST', 'TST', 'TOAST181' FROM DUAL;
CREATE TABLE table2 (FNAME, FID) AS
SELECT 'TOAST', 181 FROM DUAL UNION ALL
SELECT 'BREAD', 18 FROM DUAL UNION ALL
SELECT 'FISH', 45 FROM DUAL UNION ALL
SELECT 'BACON', 77 FROM DUAL UNION ALL
SELECT 'EGGS', 99 FROM DUAL;
輸出:
名稱 ID1 面包 XYZ BREAD_OLD BNQ 魚 美國廣播公司
db<>在這里擺弄
uj5u.com熱心網友回復:
樣本資料:
SELECT * FROM TABLE1;
FNAME ID1 FID
-------------------------
BREAD XYZ 18BREAD
FISH ABC 45FISH
BACON TBG 77BACON
EGGS CGS 99EGGS
BREAD_OLD BNQ 18BREAD_OLD
SELECT * FROM TABLE2;
FNAME FID
----------
BREAD 18
FISH 45
BACON 77
EGGS 99
詢問:
在查詢中,我們在 FID 上連接 TABLE1 和 TABLE2(使用 REGEX_SUBSTR 來提取 TABLE1 FID 的前 n 個數字),因此行 'BREAD_OLD' 將與來自 TABLE2 的行 'BREAD' 連接,并且當我們添加條件 FNAME IN ('BREAD') 時兩個 ID1 'BREAD' AND 'BREAD_OLD' 將被選中。
SELECT ID1
FROM
(SELECT
TO_NUMBER(REGEXP_SUBSTR(FID,'^[0-9]{1,}'),'9999') AS FID,FNAME,ID1
FROM TABLE1)V
JOIN TABLE2 T
ON (V.FID=T.FID)
WHERE T.FNAME IN ('BREAD','FISH')
結果:
ID1
---
XYZ
ABC
BNQ
uj5u.com熱心網友回復:
一種選擇是通過將連接列table2與提取的子字串匹配到列的_字符來連接表,例如fidtable1
SELECT id1
FROM table1 t1
JOIN table2 t2
ON REGEXP_SUBSTR(t1.fid,'[^_] ') = t2.fid||t2.fname
WHERE t2.fname IN ('BREAD','FISH')
Demo
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467742.html
上一篇:SQL-基于一個值回傳所有事務
下一篇:SAS中的條件問題
