我们可以在没有任何公共密钥的情况下加入两个表

时间:2015-10-30 12:48:47

标签: sql sql-server

我想将表连接到另一个表。请检查下面的查询。我想加入OASC T3表。因此,如果我更新此表中的数据,还应该更新Rest。请帮忙

SELECT distinct concat([Segment_0], '-' , [Segment_1], '-' ,[Segment_2]) As 'AcctCode',
                T1.[AcctName], T2.[Name], T3.[Code], T3.[Name],
                T0.[DebLTotal] AS 'ANNUAL BUDGET', T0.[DebRLTotal] AS 'UTILISED BUDGET' ,
                (T0.[DebLTotal]-T0.[DebRLTotal]) AS 'BALANCE BUDGET' 
FROM OBGT T0
    INNER JOIN OACT T1 ON T0.[AcctCode] = T1.[AcctCode]
    INNER JOIN OBGS T2 ON T0.[Instance] = T2.[AbsId],
    OASC T3
WHERE T2.[Name] = [%0]

正如您在此查询中所看到的,我使用具有段的concat函数从OACT获取数据。和OBGT表中的名称.OACT和OBGT有内部联接。所以我可以轻松更新所有数据。但现在OACT Segment_1和Segment_2的细分也可以在OASC中使用。但不同的是,在这个表中我只有segmentId字段。它只有两个ID,1和2。 1个segmentId值与Segment_1相同,而SegmentId下2个值与Segment_2相同。所以我想加入OASC表。所以,如果我从OASC表中放入条件,那么休息数据也应该更新

2 个答案:

答案 0 :(得分:0)

如果您有以下两个表格,请回复您的评论......

Table_A (Col1 int, Col2 char)
1,A
2,B
3,C

Table_B (Col1 int, Col2 char)
10,X
11,Y
12,Z

...以及以下查询...

SELECT A.Col1, A.Col2, B.Col1, C.Col2
FROM Table_A as A
FULL OUTER JOIN Table_B as B ON 1 = 1

......你会得到......

Col1 Col2 Col1 Col2
   1    A   10    X
   1    A   11    Y
   1    A   12    Z
   2    B   10    X
   2    B   11    Y
   2    B   12    Z
   3    C   10    X
   3    C   11    Y
   3    C   12    Z

我希望清除问题的完整外连接部分。 "更新"你的问题的一部分应该由触发器处理。

修改 哦!我想我明白了,现在......你的OASC表没有规范化。在ID列中,它将为1或2.当它有1时,其他列应该加入到[segment_1]列中,当它有2时,它应该与[segment_2]列连接。如果我理解正确,这是解决方案......

  1. 您应该考虑正确规范数据库。它可以防止将来出现这类问题。但假设你不能这样做......
  2. 您希望内部联接如下:INNER JOIN OASC ON (OASC.ID = 1 AND OASC.SomeColumn = [segment_1]) OR (OASC.ID = 2 AND OASC.SomeColumn = [segment_2])

答案 1 :(得分:0)

现在,通过使用此查询,我可以获得我想要的结果

SELECT distinct concat([Segment_0], '-' , [Segment_1], '-',[Segment_2])  As 'AcctCode',T1.[AcctName], T2.[Name],concat(T3.[Code],'-',T3.[Name]),T0.[DebLTotal] AS 'ANNUAL BUDGET KSH',
T0.[DebRLTotal] AS 'UTILISED BUDGET' , T3.[Name] , T3.[Code], 
(T0.[DebLTotal]-T0.[DebRLTotal]) AS 'BALANCE BUDGET' ,
(SELECT concat(T3.Code , '-', T3.[Name])  where T3.SegmentId = '1') AS 'Project',
(SELECT concat(T3.Code , '-', T3.[Name])  where T3.SegmentId = '2') AS 'Distt' 
FROM OBGT T0 INNER JOIN OACT T1 ON T0.[AcctCode] = T1.[AcctCode] INNER JOIN OBGS T2 ON T0.[Instance] = T2.[AbsId] INNER JOIN OASC T3 ON (T3.SegmentId = '1' AND T3.Code = [Segment_1] ) OR (T3.SegmentId = '2' AND T3.Code = [Segment_2])