具有不同数据类型SQL的内部联接
我有一些表,让我们称它们为table具有不同数据类型SQL的内部联接,sql,sql-server,inner-join,Sql,Sql Server,Inner Join,我有一些表,让我们称它们为tableGroupMember ID GroupID Username 1 1 Frey 2 2 Anne 3 2 Bryan 4 3 Belle 5 3 Will 6 4 Drio 7 5 Maxio 8 5 James 这是表邮箱 ID FromUser ToUser Message Approval 1
GroupMember
ID GroupID Username
1 1 Frey
2 2 Anne
3 2 Bryan
4 3 Belle
5 3 Will
6 4 Drio
7 5 Maxio
8 5 James
这是表邮箱
ID FromUser ToUser Message Approval
1 Belle Client Hello Group 2
2 Anne Client Hai Group 1
3 Maxio Client Hii Group 4
4 Drio Client hey Group 1
我想从邮箱中选择*(GroupID=1)
因此,如果GroupID=1,它将显示以下结果:
ID FromUser ToUser Message Approval
2 Anne Client Hai Group 1
4 Drio Client hey Group 1
问题是GroupID
的数据类型是INT,而Approval
的数据类型是NVARCHAR。如何解决它?类似这样的问题:
select *
from Mailbox m
inner join GroupMember g on g.GroupID = cast(right(m.Approval, 1) as int)
where m.Approval = 'Group 1'
无法使用列GroupId从邮箱中选择,因为该表没有该列,但如果只想使用该数字进行选择,可以使用如下语句
SELECT *
FROM Mailbox
WHERE Approval LIKE 'Group ' + @id
另外,如果您想加入表,也可以用同样的方法
SELECT *
FROM Mailbox AS M
JOIN GroupMember G ON M.Approval LIKE 'Group ' + G.GroupID
我建议您使用其他方法将值连接到类似函数的LIKE语句。但是在大多数SQL引擎和版本中,使用+运算符是可行的。您可以使用字符串函数。考虑到现场批准由“组”和编号组成,您可以替换
“组”和将字符串转换为数字:
使用联接:
未加入(从GroupId=1的邮箱获取数据):
或使用Concat:
这是一个糟糕的设计。Approval应该与GroupID的数据类型相同,并且应该有一个外键约束。因为我有其他表,其中包含与datatype INT中的GroupID相关的列,所以我使用了datatype INT@DevlEnformanate,我想您误解了。批准不应为NVARCHAR。它应该是INT,并且可能有FK约束。此外,fromUser和ToUser的邮箱表应该是实际用户的外键。如果你有27个“John”用户怎么办。。将ID保留给相应的发件人/收件人。需要时,您可以随时连接回用户表以获取名称,无论如何,通过PK上的索引将非常快。使用“组”一词是设计缺陷的一部分,而不是其原因。感谢您的帮助,但我只想根据问题选择GroupID=1
notApproval='group1'
,您不需要前导的'%'
,删除它后,查询就可以执行了。事实上,你根本不需要喜欢。PS-与联接表
有什么关系?哦,对了,在这种情况下,不需要通配符。JOIN表
来自一个测试,它在我没有注意到的情况下出现在这里。谢谢你告诉我。
SELECT * FROM Mailbox
JOIN GroupMember
ON CAST(REPLACE(Mailbox.Approval,'Group ','')AS INT)=GroupID
WHERE GroupID=1
SELECT * FROM Mailbox WHERE CAST(REPLACE(Mailbox.Approval,'Group ','')AS INT)=1
SELECT * FROM Mailbox
JOIN GroupMember
ON Mailbox.Approval=CONCAT('Group ',GroupMember.GroupID)
WHERE GroupID=1