如何从SQL连接表中获取实际值

时间:2014-08-07 12:25:01

标签: sql sql-server

我有两个表[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方面不是很有经验,所以我不确定这是获取此数据的正确方法(查询)。最后,我想获取用户的所有字符串值通知,以便我可以在视图中显示它们。

5 个答案:

答案 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