|
基本上,我有两个表,表A包含我要拿出的实际项目,表B用于语言翻译。
6 G& W; A: F% A1 s. d3 d8 x l因此,例如,表A包含实际内容。在表中随时使用文本,而不是存储实际的varchar值,而是存储与表B中存储的文本相关的ID。这使我可以通过向表B中添加languageID列来对表中的同一行进行多次翻译数据库。
' x( \$ Z x1 T! a+ B' G例子:
" \& T! \8 |: l" j" _5 I2 x# M表A
" `! E& A, _- ^Title (int). B, _: _0 p3 f8 m ^8 U
Description (int)
T9 T! A G' D: b; }Other Data..... P g) y7 J" p# G; q
# G4 v; F$ V) t表B% `3 X' m( @0 m$ U7 D3 A
TextID (int) - This is the column whose value is stored in other tables; O* h& {1 v! A9 R
LanguageID (int)4 U3 W" C& Q5 C0 ?
Text (varchar)9 n. G* `) E# `( r$ @1 Z
6 P2 F4 w# V: F. \我的问题更多是要求就如何最好地解决此问题提出建议。理想情况下,我需要一个查询,我可以使用该查询从表中进行选择,并从表中获取与文本ID相对的文本。当前,当我在表中有两个文本项时,这就是我要做的:' V" g+ e- B# G! L/ [
SELECT C.ID, C.Title, D.Text AS Description5 o ]4 T+ ?) x9 Q% F+ ^
FROM% L5 i% j" t i8 g4 W% q
(SELECT A.ID, A.Description, B.Text AS Title
8 G6 V" F- k) Z# T" M: ]FROM TableA A, TranslationsTable B" u' \( E& L1 C8 T5 b
WHERE A.Title = B.TextID AND B.LanguaugeID = 1) C
1 ^5 M& T9 N, o9 \$ p3 WLEFT JOIN TranslationsTable D! k6 \; c2 f+ Q7 X% E& O
ON C.Description = D.TextID AND D.LanguaugeID = 1$ l: \' ~, _; ]
该查询使我从表AI中寻找的行(使用内部select语句中的where语句)具有基于所使用的语言ID而不是文本ID的实际文本。
6 Q6 e/ r# Y; y. {( r. s当我仅使用一个或两个需要翻译的文本项,但是添加了第三个或更多的文本项时,这种方法就很好用了,它开始变得非常混乱-本质上是该示例顶部的另一个左连接。. s$ b2 n! H! g. r$ ]4 s
对更好的查询有任何建议,或者至少是一种在一行中处理3个或更多文本项的好方法吗?. X4 l3 m: [3 F
根据建议,我添加了两个表的示例:0 t( w# V K2 D! }0 V
Table A
2 o& {0 ^4 f0 Z% ` ---------------------------
) u7 R z. S8 R4 k, j f ID |Title |Description
; V; q4 C& y7 I1 K; f H8 A ---------------------------
4 B, ~: L/ X% A+ Y+ J: y 1 |1 |2
- ~5 m, e+ \1 \6 H! W7 [* b5 u --------------------------- . B) w0 w3 z0 I
2 |3 |4 ; t( ?; ~& b* f9 A
---------------------------" w% t: n7 K0 v1 ^8 K2 S
Table B (Translations Table)
4 C2 q7 `8 G" y' w9 k% v ---------------------------
% f' @5 M2 M/ ?: ?8 L* b ID |LanguaugeID|Text
! H& M2 r c3 X8 R& l* t ---------------------------
; J, x+ f4 j5 F- Y 1 |1 |Here is title one
* Q J% D) [0 f( `4 h. N ---------------------------
) d9 S6 K: }9 J" P 1 |2 |Here is a title one in espanol
2 V& ]/ G; a: i- l0 `/ p9 N ---------------------------
: `; h& q# N" D0 E; Y 2 |1 |Here is description one% V" O7 `+ b: x
---------------------------
* {* C* {# |5 R, z) K u2 M 2 |2 |Here is description one in espanol
9 M( D( ^7 ]1 k- y ---------------------------% q/ y3 l/ z9 F/ d& J
3 |1 |Title 20 M3 ^( u9 y. o, l3 @5 G8 V- r
---------------------------
: @( Z, n" w8 v" _6 u# T. f 4 |1 |Description 2
, @$ C2 E% d2 \& g! E0 F: v ---------------------------
$ O# ~' F3 n% m% ?我想要的是能够从已经有表B中的文本的表A中拉出一行,而不仅仅是ids-并且能够对需要翻译的几列执行此操作。# ~$ w0 v+ V1 X2 b
3 [2 W+ h" p- n4 @解决方案:* Y2 T3 G' G! S0 A" E
7 [0 g: ^& v1 M( {: _
' Q7 Y# C$ o# ~. J' b. \
9 G# t* _0 |8 m2 g% G1 _ 考虑使用函数为需要翻译的每一列返回数据。一种可能是:
, H1 n+ @/ S% E: r& D P/ zCREATE FUNCTION dbo.fTranslate4 T: N; O8 G6 F: R7 z
(@TextId int, @LanguageId int)
! R% V4 X3 W4 F, w* TRETURNS nvarchar(100) -- Should use nvarchar, and set to max length of string
9 I3 n8 y* ^% ^" Z) G8 K. hAS2 ]" S. M0 Q1 ?
BEGIN
# U+ Z3 }: ?8 U5 j1 `( R) C SELECT [Text] -- Reserved wordin SQL, rename that column!& Q% Y' w3 ^4 W
FROM TableB% D" v, `6 ~) f, `/ [
WHERE TextId = @TextId
1 d; b* i; s* o/ }5 Y* l7 I7 v And LanguageId = @LanguageId
5 |" J* [& D- _) S$ U8 p# g' n2 t/ g END
" C3 `- b( |7 K1 D# y' w, ?然后将查询写为:) R4 C! u) ]( d% \
SELECT6 ?1 K1 A x3 w" [# U! ?7 D
ID,
3 m$ f8 M0 m# r dbo.fTranslate(Title, @LanguageId) Title,# [+ c5 Z V' t( p* ^ i
dbo.fTranslate(Description, @LanguageId) Description
% g+ |4 Q/ R* u$ L {& q3 N8 l FROM TableA8 q& Y5 N8 _& z
这可能效果不佳,因为您必须为返回的每一行的每个翻译列调用一次函数(即,每100行3列=: }8 p( Q2 }5 h+ X ^! c8 P/ a
300个函数调用),但是如果您一次只返回一行,它的性能可能不会那么差。测试一下并保持警惕。 |
|