我有两个表[dbo].Notifications
和[dbo].ClientsNotifications
,其中:
[dbo].Notifications
:
ID : Notification
1 : 'Notification1'
2 : 'Notification2'
3 : 'Notification3'
and so on...
和
[dbo].ClientsNotifications
:
Id : ClientId : NotificationId
1 : 1 : 1
2 : 2 : 2
3 : 1 : 3
4 : 5 : 2
and so on..
我想要的是给定ClientId
从[dbo].Notifications
获取所有字符串值.SELECT *
我试过这样的事情:
FROM [dbo].Notifications c, [dbo].ClientsNotifications a
WHERE a.ClientId IN (
SELECT c.Notification
FROM [dbo].ClientsNotifications a2, [dbo].Notifications c2
WHERE a2.ClientId = 1
)
但它给了我这个错误:
Msg 245,Level 16,State 1,Line 1
将nvarchar值'Notification1'转换为数据类型int时,转换失败。
我在SQL方面不是很有经验,所以我不确定这是获取此数据的正确方法(查询)。最后,我想获取用户的所有字符串值通知,以便我可以在视图中显示它们。
答案 0 :(得分:3)
使用此:
select n.Notification
from Notifications n
where n.Id in
( select cn.NotificationId
from ClientNotifications cn
where cn.ClientId = 1
)
选择ClientNotifications
中匹配记录的所有通知。由于您只希望join
字段,因此无需Notification
。如果你做需要来自其他表的值,请使用:
select n.Notification
, cn.ClientId /* some fields from ClientNotifications */
from Notifications n
join ClientNotifications cn
on n.Id = cn.NotificationId
where cn.ClientId = 1
答案 1 :(得分:2)
您的代码正在尝试从通知消息列表中获取ClientID。尝试:
SELECT Notification
FROM Notifications
JOIN ClientsNotifications
ON Notifications.ClientId = ClientsNotifications.ClientId
WHERE ClientId = 1
答案 2 :(得分:1)
您正在子查询中选择notifincation字符串,并尝试获取客户端ID与通知字符串相同的记录。这不仅仅是比较不同类型的数据(因此也就是错误),它还会比较彼此无关的值。
您应该在查询中使用连接而不是子查询:
select
c.Notification
from
[dbo].ClientsNotifications a
inner join [dbo].Notifications c on c.ID = a.NotificationId
where
a.ClientId = 1
答案 3 :(得分:0)
试试这个:
SELECT n.Notification -- The text of the notification record
FROM [dbo].Notifications n
INNER JOIN [dbo].ClientsNotifications cn -- join Notifications table to ClientNotifications table
ON n.Id = cn.NotificationId -- when Notification.Id matches ClientNotification.NotificationId
WHERE cn.ClientId = 1 -- where ClientId = 1
使用内部联接应该比使用子查询更有效。
答案 4 :(得分:0)
您的子查询将返回varchar(Notification1,Notification2或Notification3):
SELECT c.Notification
FROM [dbo].ClientsNotifications a2, [dbo].Notifications c2
WHERE a2.ClientId = 1
我假设您只是更改子查询以使其正常工作
SELECT c.ID
FROM [dbo].ClientsNotifications a2, [dbo].Notifications c2
WHERE a2.ClientId = 1