是否可以INNER JOIN 2 id为不同的类型/值?

时间:2015-03-13 19:19:58

标签: sql sql-server join inner-join

正如标题所说,我正在尝试INNER JOIN对具有不同值/数据类型的列。

在一个数据库表中,让我们称之为表A我想做一个select语句来获取几列(Subject,Name,Description,Date)的值。虽然我也想要一个关系名称。但问题是关系名称(在关系表中设置,表B)在表A中显示为字符串值(D0001001) - 因此不是文字名称。

为了获得文字关系名称,有一个表B的链接,其具有ID列1001-1000~和关系' literal'名称列。因此,例如在表B中,ID 1001匹配公司名称MC DONALDS,在表A中,RelationID是D0001001(MC DONALDS)。

不要问我为什么表A中的RelationID与前面的怪异D000有关,我也不知道但它有一些功能。

回到问题所在。我想从表A中获取一些字段,但也要从表B中获取文本关系名称,它与表A的relationID值匹配。

所以问题是,我如何INNER JOIN对这两种不同的价值/类型?表A中的RelationID是字符串类型(确切地说是nvarchar),而在表B中,与关系名称匹配的IDInteger类型。

我以为我可以解决它:

  1. 在查询中执行LIKE语句,其中表B(1001整数)的ID部分匹配表A的RelationID(D0001001字符串)。然而,这没有工作

  2. 通过替换RelationID' D000'来执行REPLACE语句没有价值:""。对于表A值,这可能仍然需要某种类型的强制转换为整数。这里有一些错误,可能是因为语法错误。

  3. 到目前为止我所拥有的:

    SELECT 
        TableA.subject, TableA.Name, TableA.Description, TableA.Date, 
        TableB.RelationName 
    INNER JOIN 
        TableB ON TableA.RelationID = TableB.ID
    

    这返回了一个不可能的转换(字符串/整数)。

    然后我尝试了:

    SELECT 
        TableA.subject, TableA.Name, TableA.Description, TableA.Date, 
        TableB.RelationName 
    INNER JOIN 
        TableB ON TableB.ID LIKE '% TableA.RelationID  %'
    

    这也不起作用(EOF)。

    为了让我的表格更加清晰:

    表A     + ------------ + ----------- + ------------------ + ----- ---------------- + ----------- +     | RelationID |主题|说明|名称|日期|     + ------------ + ----------- + ------------------ + ----- ---------------- + ----------- +     | D0001001 |快餐|一些描述|填料名称| 13-3-2015 |     | D0001002 |饮料|一些描述|填料名称| 10-3-2015 |     | D0001003 |汽车|一些描述|填料名称| 7-3-2015 |     + ------------ + ----------- + ------------------ + ----- ---------------- + ----------- +

    表B

    +------+--------------+
    |  ID  | RelationName |
    +------+--------------+
    | 1001 | MC DONALDS   |
    | 1002 | COCA COLA    |
    | 1003 | MERCEDES     |
    +------+--------------+
    

    - > INNER加入ID和RelationID

    任何替代方案?提前致谢!

4 个答案:

答案 0 :(得分:5)

要逃离转化错误,请使用RelationID然后Substring convertRelationID然后INT删除JOIN中的第一个字符ID

中的tableA
SELECT TableA.subject,
       TableA.Name,
       TableA.Description,
       TableA.Date,
       TableB.RelationName
FROM   tableA
       INNER JOIN TableB
               ON CONVERT(INT, Substring(TableA.RelationID, 2, Len(TableA.RelationID))) = TableB.ID 

答案 1 :(得分:1)

  

在查询中执行LIKE语句,其中表B的ID(1001   整数)部分匹配表A的RelationID(D0001001字符串)。   然而,这并没有奏效。

反过来试试:

SELECT TableA.Subject, 
       TableA.Name, 
       TableA.Description, 
       TableA.Date, 
       TableB.RelationName 
FROM TableA
INNER JOIN TableB ON TableA.ID LIKE '%' + CAST(TableB.RelationID AS NVARCHAR(50)) + '%'

答案 2 :(得分:1)

SELECT TableA.subject, TableA.Name, TableA.Description, TableA.Date, TableB.RelationName1
FROM TableA -- insert this line here
INNER JOIN TableB 
ON TableB.ID LIKE '%TableA.RelationID%'

为了使第二个查询运行,您需要插入from子句。除非这是一个错误的上传应该使它工作,虽然它可能不会给你你想要的。

如果RelationalID列总是具有相同的加法,我会考虑将其从字符串中删除。有类似的东西:

ON TableB.ID = RIGHT(TableA.RelationalID,4)

SQL应该从字符串转换为整数,以便在比较中进行隐式转换。如果不只是添加演员声明:

ON TableB.ID = CAST(RIGHT(TableA.RelationalID,4) AS INT)

答案 3 :(得分:1)

您可以在LIKE中使用INNER JOIN,但这会降低查询的效果,因为LIKE有时会阻止有效的索引使用。