我有兩張這樣的桌子
表人
| ID | 姓名 |
|---|---|
| 10 | 最大限度 |
| 11 | 本 |
| 12 | 盧克 |
表 Bike(person_id 列是 varchar)
| 自行車ID | 自行車名 | Person_id |
|---|---|---|
| 1 | 大力神 | 10 |
| 2 | 靈思 | 11、12 |
現在我需要一張這樣的桌子
| ID | 姓名 | 自行車ID | 自行車名 |
|---|---|---|---|
| 10 | 最大限度 | 1 | 大力神 |
| 11 | 本 | 2 | 靈思 |
| 12 | 盧克 | 2 | 靈思 |
我用這個 SQL 試過了:
SELECT * From Person person
LEFT JOIN Bike bike
ON (cast(person.id as varchar(10)) = bike.id);
并收到此表:
| ID | 姓名 | 自行車ID | 自行車名 |
|---|---|---|---|
| 10 | 最大限度 | 1 | 大力神 |
我正在使用 Oracle 資料庫。
uj5u.com熱心網友回復:
像你一樣存盤值總是一個壞主意(談論bike.person_id列)。
做你想做的事情的一種選擇是拆分person_id成行,然后執行連接:
樣本資料:
SQL> with
2 person (id, name) as
3 (select 10, 'Max' from dual union all
4 select 11, 'Ben' from dual union all
5 select 12, 'Luke' from dual
6 ),
7 bike (bike_id, bike_name, person_id) as
8 (select 1, 'Hercules', '10' from dual union all
9 select 2, 'Linx' , '11,12' from dual
10 )
11 --
查詢從這里開始:
12 select p.id, p.name, x.bike_id, x.bike_name
13 from person p join
14 (select b.bike_id, b.bike_name,
15 regexp_substr(b.person_id, '[^,] ', 1, column_value) person_id
16 from bike b cross join
17 table(cast(multiset(select level from dual
18 connect by level <= regexp_count(b.person_id, ',') 1
19 ) as sys.odcinumberlist))
20 ) x on x.person_id = p.id;
ID NAME BIKE_ID BIKE_NAM
---------- ---- ---------- --------
10 Max 1 Hercules
11 Ben 2 Linx
12 Luke 2 Linx
SQL>
uj5u.com熱心網友回復:
您可以使用以下連接技巧:
SELECT p.id, p.name, b.bike_id, b.bike_name
FROM Bike b
INNER JOIN Person p
ON ',' || b.Person_id || ',' LIKE '%,' || CAST(p.id AS varchar(10)) || ',%';
順便說一句,您應該避免將 CSV 存盤在人員列中。
編輯:如果該Person_id列恰好使用逗號后跟空格作為分隔符,則使用此版本:
SELECT p.id, p.name, b.bike_id, b.bike_name
FROM Bike b
INNER JOIN Person p
ON ',' || REPLACE(b.Person_id, ' ', '') || ',' LIKE '%,' || CAST(p.id AS varchar(10)) || ',%';
uj5u.com熱心網友回復:
with newbike as
(
SELECT bike_id,bike_name,
REGEXP_SUBSTR (STR, '[^,] ', 1, LEVEL) SPLIT_VALUES FROM bike
CONNECT BY LEVEL <= (SELECT LENGTH (REPLACE (person_id, ',', NULL))
FROM TAB)
);
SELECT * From Person person
LEFT JOIN newbike bike
ON person.id = bike.SPLIT_VALUES;
我們可以使用這個創建具有拆分值的新表
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478839.html
