重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
數(shù)據(jù)表示例:
目前成都創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、漣源網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
假設(shè)要將name值作為行,course值作為列,轉(zhuǎn)換后效果為:
對(duì)應(yīng)的SQL如下:
方法1:使用表連接
SELECT DISTINCT a.name,
(SELECT score FROM grade b WHEREa.name=b.name AND b.course='語(yǔ)文')?AS?'語(yǔ)文',
(SELECT score FROM grade b WHEREa.name=b.name AND b.course='數(shù)學(xué)')?AS?'數(shù)學(xué)',
(SELECT score FROM grade b WHEREa.name=b.name AND b.course='英語(yǔ)')?AS?'英語(yǔ)'
FROM grade a
方法2:使用分組
SELECT name,
SUM(CASE?course WHEN?'語(yǔ)文'?THEN score END)?AS?'語(yǔ)文',
SUM(CASE?course WHEN?'數(shù)學(xué)'?THEN score END)?AS?'數(shù)學(xué)',
SUM(CASE?course WHEN?'英語(yǔ)'?THEN score END)?AS?'英語(yǔ)'
FROM grade GROUP BY name
以下示例,希望對(duì)你有幫助:
oraconn = new OracleConnection(PublicClass.oraconnection_str);
oraconn.Open();
string sqlstr1 = " SELECT ffvt.Flex_value_meaning , ffvt.Description "
+ " FROM applsys.fnd_flex_value_sets ffvs, applsys.fnd_flex_values ffv, applsys.fnd_flex_values_tl ffvt "
+ " WHERE ffvs.Flex_value_set_name = 'MS_CH_COMPANY' AND ffvs.Flex_value_set_id = ffv.Flex_value_set_id "
+ " AND ffv.Flex_value_id = ffvt.Flex_value_id AND ffvt.Language = 'ZHT' "
+ " ORDER BY ffvs.Flex_value_set_id, ffvt.FLEX_VALUE_MEANING ";
BindingSource bindingSource2 = new BindingSource();
try
{
OracleDataAdapter da = new OracleDataAdapter(sqlstr1, oraconn);
DataTable dt = new DataTable();
bindingSource2.DataSource = dt;
da.Fill(dt);
}
catch (OracleException ex)
{
MessageBox.Show("執(zhí)行異常:" + ex.Message);
return;
}
this.cmbCompanycode.DataSource = bindingSource2;
this.cmbCompanycode.DisplayMember = "Flex_value_meaning";
this.cmbCompanycode.ValueMember = "Flex_value_meaning";
oraconn.Close();
固定列數(shù)的行列轉(zhuǎn)換如
student subject grade
---------------------------
student1 語(yǔ)文 80
student1 數(shù)學(xué) 70
student1 英語(yǔ) 60
student2 語(yǔ)文 90
student2 數(shù)學(xué) 80
student2 英語(yǔ) 100
轉(zhuǎn)換為
語(yǔ)文 數(shù)學(xué) 英語(yǔ)
student1 80 70 60
student2 90 80 100
語(yǔ)句如下:
select student,sum(decode(subject,'語(yǔ)文', grade,null)) "語(yǔ)文",
sum(decode(subject,'數(shù)學(xué)', grade,null)) "數(shù)學(xué)",
sum(decode(subject,'英語(yǔ)', grade,null)) "英語(yǔ)"
from table
group by student
2、不定列行列轉(zhuǎn)換如
c1 c2
--------------
1 我
1 是
1 誰(shuí)
2 知
2 道
3 不
......
轉(zhuǎn)換為
1 我是誰(shuí)
2 知道
3 不
這一類型的轉(zhuǎn)換必須借助于PL/SQL來(lái)完成,這里給一個(gè)例子
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
RETURN VARCHAR2
IS
--用于返回值
Col_c2 VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
Col_c2 := Col_c2||cur.c2;
END LOOP;
Col_c2 := rtrim(Col_c2,1);
RETURN Col_c2;
select a.*
from table_name a
where not exists (select 1 from table_name b where a.head=b.name)
所有版本的oracle都可以使用wm_concat()函數(shù) 。例:select wm_concat(name) as name from user;
但如果是oracle11g,使用listagg() within group()函數(shù) 。例:select listagg(name, ‘,’) within group( order by name) as name from user;
使用wm_Concat:
使用ListAgg:
結(jié)果:
最好的方法是批量修改,即每次修改5000條(一次修改不要超過(guò)一萬(wàn)條,否則影響性能). 雖然在11g中,我們也可以選擇使用merge命令,但你的這種情況最好先修改一部分然后看看影響,畢竟在生產(chǎn)環(huán)境作這樣的操作風(fēng)險(xiǎn)很大。如果是誤操作,最好還是請(qǐng)DBA來(lái)恢復(fù),雖然這樣做會(huì)被挨罵,但總比錯(cuò)上加錯(cuò),最后連挨罵的機(jī)會(huì)都沒有要好得多。如果對(duì)這些修改真的有信心,而只是從性能考慮,那可以用下面的方法(pk_col 是表的主鍵
1、構(gòu)建臨時(shí)表進(jìn)行主鍵關(guān)聯(lián)更新
需求:T1表有千萬(wàn)級(jí)別的數(shù)據(jù)量,需要更新這個(gè)表的字段a,b滿足2個(gè)條件的記錄。
做法:一般業(yè)務(wù)會(huì)將條件通過(guò)excel表格提供給開發(fā),那么開發(fā)首先需要將這個(gè)excel表格的內(nèi)容插入到臨時(shí)表T2中,考慮到a,b都不是主鍵,那么需要將a,b轉(zhuǎn)化成主鍵后再插入到T2表中,T2表中還可以保存更新前的數(shù)據(jù),方便做數(shù)據(jù)回滾,T2表中有數(shù)據(jù)后,就可以執(zhí)行下面腳本進(jìn)行更新操作:
ps:c,d是需要更新的操作,e,f是條件。必須強(qiáng)調(diào)的是id必須是主鍵
1、構(gòu)建臨時(shí)表進(jìn)行主鍵關(guān)聯(lián)更新
需求:T1表有千萬(wàn)級(jí)別的數(shù)據(jù)量,需要更新這個(gè)表的字段a,b滿足2個(gè)條件的記錄。
做法:一般業(yè)務(wù)會(huì)將條件通過(guò)excel表格提供給開發(fā),那么開發(fā)首先需要將這個(gè)excel表格的內(nèi)容插入到臨時(shí)表T2中,考慮到a,b都不是主鍵,那么需要將a,b轉(zhuǎn)化成主鍵后再插入到T2表中,T2表中還可以保存更新前的數(shù)據(jù),方便做數(shù)據(jù)回滾,T2表中有數(shù)據(jù)后,就可以執(zhí)行下面腳本進(jìn)行更新操作:
ps:c,d是需要更新的操作,e,f是條件。必須強(qiáng)調(diào)的是id必須是主鍵