?? 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 + -