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的功能。