Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用有限的连接条件连接2个表_Python_Sql_Sql Server_Join_Teradata - Fatal编程技术网

Python 使用有限的连接条件连接2个表

Python 使用有限的连接条件连接2个表,python,sql,sql-server,join,teradata,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 ID Amount Bank 123 50 aa 123 50 bb 123 50 cc 123 100 dd 123 2

我对SQL非常陌生,我正在尝试连接两个表

表A:

ID  Amount    Bank 
123  50        Barclays
123  50        tesco
123  50        HSBC
123  100       LLyods
123  200       MBNA
ID  Amount    Bank
123  50        aa
123  50        bb
123  50        cc
123  100       dd
123  200       ee
Code    Bank 
aa       Barclays
bb   tesco
cc   HSBC
dd   LLyods
e    MBNA
表B:

ID  Amount    Bank 
123  50        Barclays
123  50        tesco
123  50        HSBC
123  100       LLyods
123  200       MBNA
ID  Amount    Bank
123  50        aa
123  50        bb
123  50        cc
123  100       dd
123  200       ee
Code    Bank 
aa       Barclays
bb   tesco
cc   HSBC
dd   LLyods
e    MBNA
注意:在表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没有其他唯一的值可以用作连接条件


请社区看看你能想出什么办法,我会非常感激的。谢谢:)

您可以使用内部联接获得所需的结果

Select A.*
B.*
FROM TableA  A
 INNER JOIN TableB B
   on A.ID = B.ID
    AND A.AMOUNT = B.AMOUNT
; 

您可以使用内部联接来获得所需的结果

Select A.*
B.*
FROM TableA  A
 INNER JOIN TableB B
   on A.ID = B.ID
    AND A.AMOUNT = B.AMOUNT
; 

您是否可以创建第三个表,将表a的银行值与其对应的表B的银行值相匹配?因为如果没有某种类型的链接表来指定关系,SQL server无法知道“Barclays”=“aa”,“tesco”=“bb”等。必须存在某种类型的唯一关系,而您在提供的两个表中没有这种关系

链接表:

ID  Amount    Bank 
123  50        Barclays
123  50        tesco
123  50        HSBC
123  100       LLyods
123  200       MBNA
ID  Amount    Bank
123  50        aa
123  50        bb
123  50        cc
123  100       dd
123  200       ee
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);   

您是否可以创建第三个表,将表a的银行值与其对应的表B的银行值相匹配?因为如果没有某种类型的链接表来指定关系,SQL server无法知道“Barclays”=“aa”,“tesco”=“bb”等。必须存在某种类型的唯一关系,而您在提供的两个表中没有这种关系

链接表:

ID  Amount    Bank 
123  50        Barclays
123  50        tesco
123  50        HSBC
123  100       LLyods
123  200       MBNA
ID  Amount    Bank
123  50        aa
123  50        bb
123  50        cc
123  100       dd
123  200       ee
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);   

要直接获得所需的输出,可以执行以下操作:

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')
)
但是,如果有数百个映射,这是一个丑陋的解决方案,并且不是一个好的解决方案。它还假设(银行、ID、金额)是两个表的主键。最好的方法是像上面提到的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

要直接获得所需的输出,可以执行以下操作:

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')
)
但是,如果有数百个映射,这是一个丑陋的解决方案,并且不是一个好的解决方案。它还假设(银行、ID、金额)是两个表的主键。最好的方法是像上面提到的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


teradata或SQL Server?您正在与该联接创建多对多关系。有没有办法将表a中的银行列与表B中的银行列联系起来。也许可以在表a中创建一个列,其中包含表B中的符号?是的,我就是这么想的,我希望有人能像以前那样面对问题,想出一种创造性的方法来解决这个问题:)应该有一种方法将两个表之间的两个银行列关联起来。表B中银行列的字母与表A中银行列的名称有何关系?您必须有一些标准来确定表A中的巴克莱银行等同于表B中的aa银行。您的问题中缺少这一点。teradata或SQL Server?您正在与该联接创建多对多关系。有没有办法将表a中的银行列与表B中的银行列联系起来。也许可以在表a中创建一个列,其中包含表B中的符号?是的,我就是这么想的,我希望有人能像以前那样面对问题,想出一种创造性的方法来解决这个问题:)应该有一种方法将两个表之间的两个银行列关联起来。表B中银行列的字母与表A中银行列的名称有什么关系?你必须有一些标准来确定表A中的巴克莱银行等同于表B中的aa银行。这在你的问题中是缺失的。这仍然会创建多对多关系的交叉联接。内部联接给了我同样的条件结果-萨马尔·维杰:内心的结合给了你他想要的吗?@hollow_Victory不,它给了我和我父亲一样的结果problem@Samar当前位置很抱歉我弄错了。这仍然会在多对多关系中创建交叉联接。内部联接给了我相同的结果@–Samar Vijay:内部联接给了你他想要的东西?@hollow_Victory不,它给了我相同的结果作为我的problem@Samar当前位置对不起,我弄错了。不过在这里要小心。想想加入吧。因此,将表A连接到LinkTable将创建多对一,但在这之后,连接表B将创建多对多。连接将是连续的。但是在这里要小心。想想加入吧。因此,将表A连接到LinkTable将创建多对一,但在这之后,连接表B将创建多对多。连接将是连续的。