1

我需要加入三张桌子。前两个很容易并且基于相同的键。一个简单的外连接就可以了。第三个是棘手的。它有一个相似的键,但必须匹配一个键的左 14。这会产生我不想要的重复项。本质上,我想要与 ID 正确匹配的 TOP 1 FROM Table3。

使用 T-SQL。

这些表又大又复杂,所以我在下面概述了一个包含示例数据的表的简单示例以及我现在正在运行的查询。

表格1

ID1          ID2                 Field1    Field2    Field3    Field4
0000000000   00000000000000a     Info1     Info2     Info3     Info4
2222222222   11111111111111b     Info1     Info2     Info3     Info4
1111111111   22222222222222c     Info1     Info2     Info3     Info4

表2

ID1          ID2                 Field1    Field2  
0000000000   00000000000000a     Info5     Info6  
2222222222   11111111111111b     Info5     Info6  
1111111111   22222222222222c     Info5     Info6 

桌子

ID1          ID2                 Field1    
0000000000   00000000000000a     Info7 
0000000000   00000000000000b     Info7  
0000000000   00000000000000c     Info7  
2222222222   11111111111111b     Info7  
2222222222   11111111111111d     Info7  
1111111111   22222222222222c     Info7  

询问

SELECT
Table1.ID1,
Table1.ID2,
Table1.Field1,
Table1.Field2,
Table1.Field3,
Table1.Field4,
Table2.Field1,
Table2.Field2,
Table3.Field1
FROM Table1
LEFT JOIN Table2
ON Table1.ID1=Table2.ID2 AND Table1.ID2=Table2.ID2
LEFT JOIN Table3
ON Table1.ID1=Table3.ID2 AND LEFT(Table1.ID2,14)=LEFT(Table3.ID2,14)

我得到的回应是

0000000000 00000000000000a Info1 Info2 Info3 Info4 Info5 Info6 Info7
0000000000 00000000000000a Info1 Info2 Info3 Info4 Info5 Info6 Info7
0000000000 00000000000000a Info1 Info2 Info3 Info4 Info5 Info6 Info7
2222222222 11111111111111b Info1 Info2 Info3 Info4 Info5 Info6 Info7
2222222222 11111111111111b Info1 Info2 Info3 Info4 Info5 Info6 Info7
1111111111 22222222222222c Info1 Info2 Info3 Info4 Info5 Info6 Info7

我想要的是

0000000000 00000000000000a Info1 Info2 Info3 Info4 Info5 Info6 Info7
2222222222 11111111111111b Info1 Info2 Info3 Info4 Info5 Info6 Info7
1111111111 22222222222222c Info1 Info2 Info3 Info4 Info5 Info6 Info7
4

2 回答 2

2

我会猜测并说您使用 mssql,(使用顶部和其他东西)所以如果您使用 2005+,这将正常工作

SELECT
  Table1.ID1,
  Table1.ID2,
  Table1.Field1,
  Table1.Field2,
  Table1.Field3,
  Table1.Field4,
  Table2.Field1,
  Table2.Field2,
  t3.Field1
FROM Table1
LEFT JOIN Table2
  ON Table1.ID1=Table2.ID2 AND Table1.ID2=Table2.ID2
outer apply (select top 1 * from table3 where LEFT(Table1.ID2,14)=LEFT(Table3.ID2,14)) t3
于 2012-09-18T13:34:28.003 回答
0

除非我在要求中遗漏了某些内容,否则如果您只想为每个记录返回一条记录ID1Table3您应该能够执行以下操作:

SELECT
    t1.ID1,
    t1.ID2,
    t1.Field1,
    t1.Field2,
    t1.Field3,
    t1.Field4,
    t2.Field1,
    t2.Field2,
    tb3.Field1
FROM Table1 t1
LEFT JOIN Table2 t2
    ON t1.ID1=t2.ID1 
    AND t1.ID2=t2.ID2
LEFT JOIN
(
    select min(id2) minid2, id1
    from Table3
    group by id1
) t3
    ON t1.ID1=t3.id1 
    AND LEFT(t1.ID2,14)=LEFT(t3.minid2,14)
left join table3 tb3
    on t3.minid2 = tb3.id2
    and t3.id1 = tb3.id1
于 2012-09-18T14:00:44.017 回答