选择仅其关联值之一不在预定义列表中的所有元素

时间:2018-12-08 19:46:43

标签: sql sql-server tsql

注意:我很难为这个问题选择标题。我不确定它能准确地描述我想要的内容,因此,如果您能帮助改善标题,而不是落选,我将不胜感激。 :)


我有一个具有以下结构的表:

log:
+-----+-----+
| uid | uip | <- user id and user ip
+-----+-----+

我还有一个带有一些预定义用户ID的表:

predfined_users:
+-----+
| uid |
+-----+
|  1  |
-------
|  2  |
-------
|  3  |
-------

我要实现的目标:

我的“算法”应该找到所有uip,这些步骤对他们来说是以下步骤1:

  1. log收集与uip关联的所有不同用户
  2. 计算predfined_users表中没有多少用户。

示例:

假设这是与IP地址1.0.0.0关联的用户列表:

+-----+
| uid |
+-----+
|  1  |
-------
|  3  |
-------
|  7  |

predfined_users(7)中没有这些值之一,因此应返回1.0.0.0。我也想选择所有满足此要求的uip,这意味着与它们关联的uid中只有一个不在predfined_users中。另外,值得注意的是,如果uip仅与一个uid关联,则查询不应返回它。

我已经尝试过的东西

这是我的基本想法,但是我不确定写什么而不是???,或者即使我朝着正确的方向前进,也不确定:

SELECT [uip]
FROM log
WHERE (
    SELECT COUNT(*)
    FROM (
        SELECT DISTINCT [uid]
        FROM log WHERE [uip] = ???
    )a
    WHERE uid NOT IN (
        SELECT uid
        from predfined_users
    ) 
)=1

2 个答案:

答案 0 :(得分:1)

类似这样的东西:

select l.uip, count(distinct l.uid)
from log l left join
     predefined_users pu
     on l.uid = pu.uid
where pu.uid is null
group by l.uip;

答案 1 :(得分:-1)

您可以使用此查询来检索只有一个关联uid在表predfined_users中不存在的uips:

Select distinct uip from [dbo].[Log]
where uid not in(Select uid from predfined_users)
group by uip
having count(uip) = 1

如果要检索具有不存在关联的ui,而不考虑无关uid的数量,则可以使用以下代码:

Select distinct  uip from [dbo].[Log]
where uid not in(Select uid from predfined_users)