在有限的连接条件下加入2个桌子

时间:2017-12-08 16:39:49

标签: python sql sql-server join teradata

我是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没有其他可用作连接条件的唯一值;

社区能否看到你能想到什么,我会非常感激。谢谢:))

3 个答案:

答案 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