我是SQL的新手,我正在尝试加入两个表,
表A:
ID Amount Bank
123 50 Barclays
123 50 tesco
123 50 HSBC
123 100 LLyods
123 200 MBNA
表B:
ID Amount Bank
123 50 aa
123 50 bb
123 50 cc
123 100 dd
123 200 ee
请注意:在表B中,银行名称与表格A相同,但它以不同的格式书写,因此我无法加入。
我正在运行的脚本是:
Select A.*, B.*
FROM TableA A
Left Join TableB B
on A.ID = B.ID AND A.AMOUNT = B.AMOUNT
;
我得到的结果是,
ID Amount Bank ID AMOUNT BANK
123 50 Barclays 123 50 aa
123 50 Barclays 123 50 bb
123 50 Barclays 123 50 cc
123 50 tesco 123 50 aa
123 50 tesco 123 50 bb
123 50 tesco 123 50 cc
123 50 HSBC 123 50 aa
123 50 HSBC 123 50 bb
123 50 HSBC 123 50 cc
123 100 LLyods 123 100 dd
123 200 MBNA 123 200 ee
我想要的是,
ID Amount Bank ID AMOUNT BANK
123 50 Barclays 123 50 aa
123 50 tesco 123 50 bb
123 50 HSBC 123 50 cc
123 100 LLyods 123 100 dd
123 200 MBNA 123 200 ee
我得到的问题是它将表A的每一行连接到满足连接条件的表B的行;遗憾的是,表B没有其他可用作连接条件的唯一值;
社区能否看到你能想到什么,我会非常感激。谢谢:))
答案 0 :(得分:2)
您是否可以创建第三个表,将表A Bank值与其对应的表B Bank值相匹配?因为没有某种链接表指定关系,SQL服务器无法知道'巴克莱' =' aa',' tesco' =' bb'等等。必须有某种独特的关系,而且你在提供的两个表格中没有这种关系。
<强> LinkTable:强>
Code Bank
aa Barclays
bb tesco
cc HSBC
dd LLyods
e MBNA
然后你可以这样做:
Select A.*, B.*
FROM TableA A
JOIN LinkTable LB ON (A.Bank = LB.Bank)
JOIN TableB B ON (LB.ID = B.Bank);
答案 1 :(得分:1)
您可以使用内部联接来获得所需的结果
Select A.*
B.*
FROM TableA A
INNER JOIN TableB B
on A.ID = B.ID
AND A.AMOUNT = B.AMOUNT
;
答案 2 :(得分:0)
要直接获得所需的输出,您可以执行以下操作:
SELECT *
FROM TableA a
LEFT JOIN TableB b ON on A.ID = B.ID AND A.AMOUNT = B.AMOUNT
AND
(
(a.Bank = 'Barclays' AND b.bank = 'aa') OR
(a.Bank = 'tesco' AND b.bank = 'bb') OR
(a.Bank = 'HSBC' AND b.bank = 'cc') OR
(a.Bank = 'Lloyds' AND b.bank = 'dd') OR
(a.Bank = 'MBNA' AND b.bank = 'ee')
)
但是如果你有数百个映射,这很难看并且不是一个很好的解决方案。它还假设(Bank,ID,Amount)是两个表的PK。最好的方法是有一个链接/映射表,如上面建议的MorbidGnome,并在你的连接中包含它。
如果您没有从TableB中提取任何数据(如您的示例中所示),那么您可以使用CASE语句而不是加入TableB:
SELECT a.*,
CASE a.Bank
WHEN 'Barclays' THEN 'aa'
WHEN 'tesco' THEN 'bb'
WHEN 'HSBC' THEN 'cc'
WHEN 'Lloyds' THEN 'dd'
WHEN 'MBNA' THEN 'ee'
END AS Bank_B
FROM TableA