sqlapply
『壹』 sql 速度快的表關聯:join 和Cross Apply
您好,他們作用差別很大啊,兩個都是連表查詢,CROSS APPLY 是把兩個表合並成
一個集查詢出來(品均行比如左表7行數據,右表5行查出來就會被整合成6行數據的集);CROSS
JOIN是左表和右表乘起來的(例如左表7行數據,右表5行數據,拿出來的集就是35行數據)。
cross
join是笛卡爾集的,通常沒有join條件,通常是2個集合的關聯(表、視圖之間),如下:
select * from sys.objects
cross join sys.tables;
cross
apply是為用在給函數傳值時,如果要把表或者視圖里的很多值挨個傳給函數,就用這個,如下:
select * from
sys.dm_exec_requests r
cross apply sys.dm_exec_sql_text(r.sql_handle) s;
『貳』 sql語句的邏輯問題:有一a表,裡面有一欄位tablename,需要以tablename為再次選擇的表進行查詢
1.表名盡量不要用TABLE,這是保留字,假設用TABLENAME。
2.欄位名不要用A,容易與於後面表別名混淆。假設為FILEDA吧。
3.更新表,要有條件,一般為關鍵字相同,設置你的表TABLENAME中為CELLID吧。
則有:
update tablename set fielda=fieldnew from
(select cellId, fieldnew=houseBigness*hotTime/(select sum(houseBigness*hotTime) from HotOnline.dbo.H_UsrV b where b.cellId=a.cellId) from HotOnline.dbo.H_UsrV a ) c,
tablename where tablename.cellid=c.cellid
當然,如果還沒有創建TABLENAME表,可以直接創建,這樣可以不用關鍵欄位
select cellId, fieldA=houseBigness*hotTime/(select sum(houseBigness*hotTime) INTO TABLENAME from HotOnline.dbo.H_UsrV b where b.cellId=a.cellId) from HotOnline.dbo.H_UsrV a
但是,如果已建立了表A,並且表A是空的,也可以直接追加到表A中,這樣需要知道TABLENAME的表結構,如TABLENAME為CELLID和FIELDA兩個欄位,那麼這樣將結果插入表TABLENAME中
INSERT INTO TABLENAME select cellId, fieldA=houseBigness*hotTime/(select sum(houseBigness*hotTime) INTO TABLENAME from HotOnline.dbo.H_UsrV b where b.cellId=a.cellId) from HotOnline.dbo.H_UsrV a
『叄』 為什麼下面的sql語句會報這個錯,怎麼解決 (多次為 'S' 指定了列 'APPLY_UNIT'。)
因為派生表t中出現了兩個同樣的屬性了『ID』,把第二個星號換成你需要的列名就好了
『肆』 ORACLE 中使用pl/sql建表如何設置主鍵,點不了apply
建表要點:
1 Gengeral 中定義表名,表空間。
2 Columns 對欄位進行定義。
3 在Key選擇主鍵欄位,定義主鍵名稱,一般用表名。
不能「Apply」 一般是定義不完全。
『伍』 sql 查詢後修改值。怎麼做
你是想在查詢的結果集中不顯示ap.state的真實值,而是修改成你想用的值來替代么?
如果是的話,可以用 case 語句,如:
select
distinct
u.realname,
ap.applygroupid,
ap.title,
case ap.state
when 真實值1 then 『修改的值1』,
when 真實值2 then 『修改的值2』,
。。。。
else 『其他情況的值』
from
[apply] as ap,
[user] as u
where ap.userid=u.id and ap.userid=6
『陸』 SQL語句有什麼區別
單單這么看,看不出來有什麼區別,也就是說這兩種寫法查詢出來的結果是一樣的。但是,通常情況下,我們都會選擇第二種寫法。本人幾乎沒用過第一種寫法。
『柒』 SQL語句分析
這段語句的意思是:先從apply_form,word_report_record,Charge_Record
表中查詢相關欄位,做一個臨時表temp,再從臨時表中取數據.不知你這段查詢語句是否正確,但意思就是這樣的.
(select distinct apply_form.apply_no as 編號號,Apply_Origin_No as 來源,goods as 樣品名
稱,applicant as 單位,word_report_record.date_print as 出證時間,contact as 聯系人,fee as 應收
費用,main_dept as 應用科室,kind as 樣品類別
from apply_form,word_report_record,Charge_Record
where (apply_form.apply_no=word_report_record.apply_no) and
Apply_Form.Apply_No=Charge_Record.Apply_no and
apply_form.apply_no like "24%"
and (word_report_record.date_print between '2007-01-1'and '2007-2-1')) as temp --這一段是做臨時表.
『捌』 安裝PSU後一定要運行catbundle.sql psu apply腳本嗎
首先分析一下catbundle.sql腳本,其中有段這樣的話:
catbundle.sql will look in $ORACLE_HOME/rdbms/admin for an input XML
file named bundledata_.xml (i.e. bundledata_CPU.xml)
for information about which patches in the bundle contain which SQL
files.
即根據$ORACLE_HOME/rdbms/admin/bundledata_PSU.xml文件中的內容來決定該PSU中需要執行哪些SQL文件,bundledata_PSU.xml文件中的部分內容:
?/rdbms/admin/prvtjob.plb
?/rdbms/admin/dbmsaqds.plb
?/rdbms/admin/prvtaqds.plb
?/rdbms/admin/prvtlmd.plb
?/rdbms/admin/prvtlmc.plb
?/rdbms/admin/prvtbpp.plb
?/rdbms/admin/prvtlsby.plb
?/rdbms/admin/dbmssum.sql
?/rdbms/admin/prvtsum.plb
?/rdbms/admin/prvtsms.plb
?/rdbms/admin/prvtdefr.plb
?/rdbms/admin/prvtbstr.plb
?/rdbms/admin/prvtbcap.plb
?/rdbms/admin/initqsma.sql
應該是根據資料庫安裝不同的組件需要執行不同的SQL,繼續分析catbundle.sql腳本,文件的最後有如下幾行:
COLUMN script_file NEW_VALUE sf NOPRINT;
SELECT :scriptFile AS script_file FROM al;
@&sf
即script_file為需要執行的腳本,將catbundle.sql拷貝一份,最後幾行內容修改為:
BEGIN
DBMS_OUTPUT.PUT_LINE('script. file: ' || :scriptFile);
END;
看看打出來需要執行的腳本叫什麼。
SQL>@catbundle_test.sql psu applay
輸出script. file: /u01/app/oracle/proct/10.2.0/db_1/rdbms/admin/catbundle_PSU_OTEST_APPLY.sql
原來執行的SQL文件是catbundle_PSU_OTEST_APPLY.sql,查看該文件內容,如下內容和bundledata_PSU.xml文件中的內容相符合:
PROMPT Processing Oracle Database Packages and Types...
ALTER SESSION SET current_schema = sys;
@?/rdbms/admin/prvtjob.plb
@?/rdbms/admin/dbmsaqds.plb
@?/rdbms/admin/prvtaqds.plb
@?/rdbms/admin/prvtlmd.plb
@?/rdbms/admin/prvtlmc.plb
@?/rdbms/admin/prvtbpp.plb
@?/rdbms/admin/prvtlsby.plb
@?/rdbms/admin/dbmssum.sql
@?/rdbms/admin/prvtsum.plb
@?/rdbms/admin/prvtsms.plb
@?/rdbms/admin/prvtdefr.plb
@?/rdbms/admin/prvtbstr.plb
@?/rdbms/admin/prvtbcap.plb
@?/rdbms/admin/prvtaqiu.plb
PROMPT Processing Oracle java Supplied Packages...
ALTER SESSION SET current_schema = sys;
@?/rdbms/admin/initqsma.sql
@?/rdbms/admin/initcdc.sql
即根據資料庫安裝的組件,需要執行上述SQL腳本,這里只有CATPROC和CATJAVA組件,之後執行完後往registry$history表中插入記錄:
PROMPT Updating registry...
INSERT INTO registry$history
(action_time, action,
namespace, version, id,
bundle_series, comments)
VALUES
(SYSTIMESTAMP, 'APPLY',
SYS_CONTEXT('REGISTRY$CTX','NAMESPACE'),
'10.2.0.2',
2,
'PSU',
'PSU 10.2.0.4.2');
COMMIT;
這里就重點分析那些plb文件在使用custome方式建庫的時候是否調用了,為此寫了一個SHELL腳本:
mygrep()
{
fn=$1 #保存傳入的文件名
shift
msg=$* #保存傳入的消息
fnt=`echo $fn | cut -d . -f 1` #由於SQL文件中有的是寫成@@dbmssum模式,有的是寫成@@prvtjob.plb模式,
ff=`grep "@@$fn" *.sql || grep "@@$fnt" *.sql` #即帶擴展名和不帶擴展名,因此可能需要截斷一下
if [ "$ff" != "" ]; then #對於catjava.sql中的調用是不帶@@的,所以可以進入到下面循環的是catproc.sql的
fn1=`echo $ff | awk -F:@@ '{print $1}'`
if [ "$fn1" = "catproc.sql" ]; then
if [ "$msg" = "" ]; then
echo "$fn found in $fn1"
else
echo "$msg$fn found in $fn1"
fi
else
msg="$msg$fn found in $fn1 \t"
mygrep $fn1 $msg
fi
else
grep -q $fn catjava.sql
if [ "$?" = "0" ]; then
echo "$fn found in catjava.sql"
else
echo "$fn not found"
fi
fi
}
for f in `cat << EOF #需要查詢的SQL文件名
prvtjob.plb
dbmsaqds.plb
prvtaqds.plb
prvtlmd.plb
prvtlmc.plb
prvtbpp.plb
prvtlsby.plb
prvtsum.plb
prvtsms.plb
dbmssum.sql
prvtdefr.plb
prvtbstr.plb
prvtbcap.plb
prvtaqiu.plb
initqsma.sql
initcdc.sql
EOF`
do
msg=""
mygrep $f $msg
done
執行輸出如下:
prvtjob.plb found in catproc.sql
dbmsaqds.plb found in catqueue.sql catqueue.sql found in catproc.sql
prvtaqds.plb found in catqueue.sql catqueue.sql found in catproc.sql
prvtlmd.plb found in catproc.sql
prvtlmc.plb found in catproc.sql
prvtbpp.plb found in catdpb.sql catdpb.sql found in catproc.sql
prvtlsby.plb found in catproc.sql
prvtsum.plb found in catproc.sql
prvtsms.plb found in catproc.sql
dbmssum.sql found in catproc.sql
prvtdefr.plb found in catreps.sql catreps.sql found in catrep.sql catrep.sql found in catproc.sql
prvtbstr.plb found in catpstr.sql catpstr.sql found in catproc.sql
prvtbcap.plb found in catpstr.sql catpstr.sql found in catproc.sql
prvtaqiu.plb found in catqueue.sql catqueue.sql found in catproc.sql
initqsma.sql found in catjava.sql
initcdc.sql found in catjava.sql
雖然存在遞歸調用,但最終都是在catproc.sql和catjava.sql腳本里調用了,熟悉custome方式建庫的應該都知道這兩個腳本在建庫階段必須調用的,
因此不需要運行catbundle.sql psu apply啦,神馬都是浮雲啦。
另外對於readme里的view_recompile_jan2008cpu.sql也是不需要執行的,腳本中的一小段:
CURSOR alter1(objectno number) IS
SELECT o.obj#,
'ALTER VIEW' || ' "' || u.name || '"."' || o.name || '" '
|| 'COMPILE '
FROM obj$ o, user$ u WHERE o.type#=4 AND
u.user# = o.owner# AND o.obj# in (select unique d_obj# from access$ where types=9)
AND o.obj# > objectno order by obj#;
該腳本只是把所有符合條件的視圖COMPILE了一遍,這個在建庫的過程中都執行了
其實在readme里也說了,需要run腳本的只有以下幾種情況:
?Using DBCA (Database Configuration Assistant) to select a sample database (General, Data Warehouse, Transaction Processing)
?Using a script. that was created by DBCA that creates a database from a sample database
?Cloning a database that was created by either of the two preceding methods, and if Section 2.3.3.1, "Loading Modified .sql Files into the Database" and Section 2.3.3.2, "Recompiling Views in the Database" were not executed after PSU 10.2.0.4.2 was applied
對於view_recompile_jan2008cpu.sql則是:
Upgraded databases require that you perform. the steps in Section 2.3.3.2, "Recompiling Views in the Database" if these steps have not previously been performed; otherwise, no post-installation steps need to be performed.
即如果升級資料庫前沒有run過則需要跑一遍,如果以前曾經run過就不需要了,僅需一次而已。
當然如果你的庫是在安裝好PSU前就已經建立的了,則catbundle.sql psu apply必須run,view_recompile_jan2008cpu.sql則曾經run過就不需要了
另外有metalink賬戶的可以看下Introction To Oracle Database catbundle.sql [ID 605795.1]這篇文章,其中有段:
Starting with Database 11.2.0.2.0, a mmy catbundle.sql is run at database upgrade and creation time, which creates a dba_registry_history entry with bundle series "PSU" and ID = "0". Reports that query on this view for the PSU series returns a row for every upgraded and newly created database.
即從11.2.0.2.0開始,建立一個新庫或者升級時會運行一個mmy catbundle.sql,這樣registry$history表中就有記錄了,也不會引起困惑了。
『玖』 sql語句如何查詢兩個值之間的差
工具/材料:Management Studio。
1、首先在桌面上,點擊「Management Studio」圖標。
『拾』 mysql 中使用圖形化界面 apply之後怎麼沒有出現sql語句
登陸mysql 終端:
mysql -uxxxxx -p dbname
check table tabTest;
如果出現的結果說Status是OK,則不用修復,如果有Error,可以用:
repair table tabTest;
進行修復,修復之後可以在用check table命令來進行檢查。在新版本的phpMyAdmin裡面也可以使用check/repair的功能。