顯示廣告
隱藏 ✕
看板 P_chippclass
作者 chippclass (善假狼賺錢中)
標題 [#]Sql - JOIN 讓其中一欄的值變成Column名稱
時間 2016-05-11 Wed. 18:07:47


把在PTT發的文轉回來放著


[ansi]
 作者  myhome6206 (Rice)                                       看板  Database
 標題  [SQL ] JOIN 讓其中一欄的值變成Column名稱                              
 時間  Tue May 10 18:13:43 2016                                              
───────────────────────────────────────

(針對 SQL 語言的問題,用這個標題。請用 Ctrl+Y 砍掉這行)
   資料庫名稱:MySQL

   資料庫版本:5.X

內容/問題描述:


我有兩個Table

一個是

Table:1         Table:2

id data         id key value
--------        ------------
 1 xxx           1  A  aaa
 2 xxx           1  B  bbb
                 2  A  xxx
                 2  B  yyy


然後可以join這兩個table 變成

id data  A   B
------------------
 1 xxx  aaa bbb
 2 xxx  xxx yyy


雖然說我覺得這有點智障,應該是在設計的時候就把A B當作Table1的column

才對,是因為這次從wordpress原有的架構去改的,也沒不能動原本的架構了

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.229.141.163
※ 文章網址: https://www.ptt.cc/bbs/Database/M.1462875226.A.7D9.html
[SQL ] JOIN 讓其中一欄的值變成Column名稱 - 看板 Database - 批踢踢實業坊
 (針對 SQL 語言的問題,用這個標題。請用 Ctrl+Y 砍掉這行) 資料庫名稱:MySQL 資料庫版本:5.X
 
※ 編輯: myhome6206 (36.229.141.163), 05/10/2016 18:15:28



 作者  chippclass (善假狼賺錢中)                               看板  Database
 標題  Re: [SQL ] JOIN 讓其中一欄的值變成Column名稱                          
 時間  Tue May 10 19:06:14 2016                                              
───────────────────────────────────────

※ 引述《myhome6206 (Rice)》之銘言:
: (針對 SQL 語言的問題,用這個標題。請用 Ctrl+Y 砍掉這行)
:    資料庫名稱:MySQL
:    資料庫版本:5.X
: 內容/問題描述:
: 我有兩個Table
: 一個是
: Table:1         Table:2
: id data         id key value
: --------        ------------
:  1 xxx           1  A  aaa
:  2 xxx           1  B  bbb
:                  2  A  xxx
:                  2  B  yyy
: 然後可以join這兩個table 變成
: id data  A   B
: ------------------
:  1 xxx  aaa bbb
:  2 xxx  xxx yyy
: 雖然說我覺得這有點智障,應該是在設計的時候就把A B當作Table1的column
: 才對,是因為這次從wordpress原有的架構去改的,也沒不能動原本的架構了



線上SQL : http://sqlfiddle.com/#!9/6b390/3

看完題目後一分鐘內的直覺解法

所以有可能不是最佳解


我是這樣想的:tb1 和 tb2 你想合在一起可是不知道怎麼處理 key

所以我第一步就想:如果沒有key怎麼做?

tb1          tb3

 id data    id value
 --------    ----------
  1 xxx      1 aaa
  2 xxx      2 xxx

阿就直接join阿,只是把tb3 的 value 欄位名稱改成A就是了



同理,key=B時也是一樣的做法,所以join兩次就解決



所以,下一個問題就是可以由 tb2 得到 tb3 和 tb4 嗎?

那就用 select  where key='A' 這樣的條件就可以




所以把上面的幾個子問題合併後

最後就是那個靠直覺想出來的答案


-----
把SQL貼過來好了,如果線上SQL服務掛了也可以看
-----

建立測試用假資料:

create table tb1 (
  id int ,
  data varchar(5)
);
insert into tb1 (id,data) values (1,'xxx'),(2,'xxx');
create table tb2 (
  id int ,
  key char(1),
  value varchar(5)
);
insert into tb2 (id,key,value) values
(1,'A','aaa'),(1,'B','bbb'),(2,'A','xxx'),(2,'B','yyy');

-----

解:

select *
from tb1
natural left join
(
    select id,value A
    from tb2
    where key='A'
)tb3
natural left join
(
    select id,value B
    from tb2
    where key='B'
)tb4
;






--
※ 作者: chippclass 時間: 2016-05-11 18:07:47
※ 看板: P_chippclass 文章推薦值: 0 目前人氣: 0 累積人氣: 304 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇