Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
具有不同数据类型SQL的内部联接_Sql_Sql Server_Inner Join - Fatal编程技术网

具有不同数据类型SQL的内部联接

具有不同数据类型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

我有一些表,让我们称它们为table
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
not
Approval='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