正如标题所说,我正在尝试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中,与关系名称匹配的ID
是Integer
类型。
我以为我可以解决它:
在查询中执行LIKE语句,其中表B(1001整数)的ID部分匹配表A的RelationID(D0001001字符串)。然而,这没有工作
通过替换RelationID' D000'来执行REPLACE
语句没有价值:""。对于表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)。
为了让我的表格更加清晰:
表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
任何替代方案?提前致谢!
答案 0 :(得分:5)
要逃离转化错误,请使用RelationID
然后Substring
convert
至RelationID
然后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
有时会阻止有效的索引使用。