是否可以 INNER JOIN 2 个不同 type/values 的 id?

Is it possible to INNER JOIN 2 id's of a different type/values?

正如标题所说,我正在尝试 INNER JOIN 具有不同 values/data 类型的列。

在一个数据库 table 中,我们称它为 Table A 我想做一个 select 语句来获取几列的值(主题、名称、描述、日期) .虽然我也想要一个关系名称。然而,问题是关系名称(在关系 table、Table B 中设置)在 Table A 中显示为字符串值 (D0001001) - 因此不是文字名称。

要获得文字关系名称,有一个 link 和 Table B,它有一个 ID 列 1001 - 1000~ 和一个关系 'literal' 名称列。例如,在 table B 中,ID 1001 匹配公司名称 MC DONALDS,在 table A 中,RelationID 是 D0001001 (MC DONALDS)。

别问我为什么tableA里的RelationID前面有一个奇怪的D000,我也不知道,但它有一些功能。

所以回到问题。我想从 table A 获取一些字段,但也想从 table B 获取与 table A relationID 值匹配的文字关系名称。

所以问题是,我如何 INNER JOIN 这两个不同的 values/types? tableA中的RelationID是字符串类型(准确地说是nvarchar),TableB中匹配关系名的ID是一个Integer 类型。

我想我可以通过以下方式修复它:

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

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

我目前拥有的:

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)。

为了让我的 table 更清楚一点:

Table一个 +------------+------------+----------------+----- --------------+------------+ |关系ID |主题 |说明 |名称 |日期 | +------------+------------+----------------+----- --------------+------------+ | D0001001 |快餐 |一些描述 |填表人姓名 | 13-3-2015 | | D0001002 |饮品 |一些描述 |填表人姓名 | 10-3-2015 | | D0001003 |汽车 |一些描述 |填表人姓名 | 2015 年 7 月 3 日 | +------------+------------+----------------+----- --------------+------------+

Table B

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

--> INNER加入ID和RelationID

还有其他选择吗?提前致谢!

为了避免转换错误,使用 Substring 然后 convert 删除 RelationID 中的第一个字符,然后 RelationIDINT 然后 JOIN IDtableA

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 

Do a LIKE statement in the query where the ID of table B (1001 integer) partly matches the RelationID of table A (D0001001 string). This however didnt worked.

反过来试试:

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)) + '%'
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 应该为您进行从字符串到整数的转换,以便您在比较中进行隐式转换。如果不只是添加 cast 语句:

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

您可以在 INNER JOIN 中使用 LIKE,但这会降低查询的性能,因为 LIKE 有时会妨碍索引的有效使用。