📄 jb4-1-8-3.htm
字号:
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft FrontPage 4.0">
<TITLE></TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<body bgcolor="#fefef2" style="FONT-SIZE: 9pt">
<P><STRONG><FONT
color=#0080FF size=3 >从多个表中解析数据
</FONT>
</STRONG>
<hr>
译者名字: stavid(JD019) <br>
邮件地址:<a href="mailto:stavid@163.com">stavid@163.com</a>
<p><font size="2"> 你可以在一个QueryDataSet的多个表上指定一个查询,并且JBuilder能将修改解析到DataSet中。SQLResolve r能够解析具有多个表索引的S Q L查询。元数据搜索将检测每一列属于哪个表,并将在表之间建议一个解析指令。被元数据搜索所设置的属性为: </font></p>
<p> <font size="2"> . Column - columnName<br>
. Column - schemaName <br>
. Column - serverColumnName<br>
.Storage DataSet - tableName <br>
. StorageDataSet - resolveOrder </font></p>
<p> <font size="2"> 其中StorageDataSet的tableName属性未进行设置。tableName在每一列的基础上被识别。</font></p>
<p><font size="2"> resolveOrder属性是一个String数组,它为多表的解析过程指定解析次序。INSERT和UPDATE查询顺序地使用这个数组,DELETE查询反顺序使用数组。如果一个表被从列表中移除,那个表的列将不被解析。<br>
<br>
<br>
<font color="#000080"><b>
关于查询中表与表之间连接类型的考虑</b></font><br>
<br>
一个多表SQL查询通常在表的WHERE子句中定义了表间的连接。根据连接的性质和表的结构,这个连接可能会有下列四种截然不同的类型(假定初始表为T1,连接的表为T2)。</font></p>
<p><font size="2"> <b><font color="#000080">. 1:1</font></b></font></p>
<p> <font size="2"> 在表T2中恰好有一条记录与表T1中的一条记录相对应,反之亦然。有时为了考虑某个表的透明性或者因为每个表中列数目的限制,一个关系数据库一些表可能有这样的布局。 </font></p>
<p><font size="2"> <b><font color="#000080">. 1:M</font></b><br>
在表T2中有多条记录与表T1中的一条记录相对应,但是在表T1中只有一条记录与表T2中的一条记录相对应。例如:每位顾客可以有几个订单。 </font></p>
<p><font size="2"> <font color="#000080"><b>. M:1</b></font></font></p>
<p><font size="2"> 在表T2中恰好有一条记录与表T1中的一条记录相对应,但是在表T1中有多第7章回存修改到数据源83下载条记录与表T2中的一条记录相对应。例如:每个订单可以拥有一个产品序列号,它与产品表中的产品名称相关联。这是直接在SQL中表达的查找示例。 </font></p>
<p><font size="2"> <font color="#000080"><b>. M:M</b></font> </font></p>
<p><font size="2"> 最普遍的情况。JBuilder采用一种简化的方法来解析多个相连的表:JBuilder只解析1:1类型的连接(linkages)。然而,因为要检测一个给定的SQL查询所描述的连接是哪种类型非常困难,所以JBuilder假定任何的多表查询均为1 : 1类型。如果此多个连接表不是1 : 1类型的,你可以像下面这样来处理解析过程:</font></p>
<p> <font size="2"> <font color="#000080"><b>. 1:M</b></font></font></p>
<p> <font size="2">
在查询中,为每个从记录复制主域,通常是无关紧要的。相反,创建一个单独的从数据集,它允许正确解析修改。 <br>
<font color="#000080"><b>. M:1</b></font></font></p>
<p><font size="2"> 通常需要使用查询机制来进行处理。但是如果这个查询仅仅是为了显示的话(不对这些域进行编辑),它可以被作为一个多表查询来被处理。至少对于一列,以不能解析查找的在表中标记rowId属性。</font></p>
<p><font size="2"> <font color="#000080"><b>. M:M</b></font></font></p>
<p><font size="2"> 这种表的关系不太经常出现,并且通常它表示规格说明出错。<br>
<br>
<font color="#000080"><b>
查询字符串中表和列的引用</b></font></font></p>
<p><font size="2">
一条查询字符串中可能包含有表引用和列引用或别名。</font></p>
<p><font size="2"> . 表别名通常不用在单个表查询中,但经常用于多表查询中以简化查询字符串,或用于区分属于不同用户,但名称相同的表。<br>
<br>
SELECT A.a1,A.a2,B.a2,B.a3 FROM Table_Called_a AS A,Table_Called_B ASB</font></p>
<p><font size="2"> . 列引用通常用于给计算列赋名称,但也常用于区分源于不同表但名称相同的列。<br>
<br>
SELECT T1.NO AS NUMBER, T2.NO AS NR FROM T1, T2</font></p>
<p><font size="2"> . 如果列别名出现在查询字符串中时,在JBuilder 中它就成为Column 的ColumnName。其在原始表中的物理名称会被赋予serverColumnName属性。当产生解析查询时,QueryResolver就会使用serverColumnName。 </font></p>
<p><font size="2"> . 如果表别名出现在查询字符串中,它常常用于标识Column的ColumnName。别名本身并不直接出现在JBuilder API中。</font></p>
<p><font size="2"><b><font color="#000080">
控制列属性的设置</font></b></font></p>
<p><font size="2"> 除非metaDateUpdate属性不包含metaDateUpdate.TABLENAME,否则TablenName,schemaName和serverColumnN ame的属性由QueryDateSets的Queryprovider进行设置。</font></p>
<p><font size="2" color="#000080"><b>如果表不能更新</b></font></p>
<p> <font size="2"> 如果在某个表查询中没有rowId,所有对表的修改没有被saveChanges()调用保存。</font></p>
<p><font size="2"><font color="#000080"><b>
用户如何指定一个表永不被修改 </b></font></font></p>
<p><font size="2">
StorageDateSet的resolveOrder属性用于指定多表解析的解析次序的字符串数组。INSERT和UPDATE查询顺序地使用了该数组, DELETE查询逆顺序地使用数组。如果一个表从列表中删除,源于该表的列将不会被解析。 </font></p>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -