Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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查询中的'IN'充当'和'not'或'?_Sql_Sql Server_Sql Server 2008_Tsql_Relational Division - Fatal编程技术网

SQL查询中的'IN'充当'和'not'或'?

SQL查询中的'IN'充当'和'not'或'?,sql,sql-server,sql-server-2008,tsql,relational-division,Sql,Sql Server,Sql Server 2008,Tsql,Relational Division,请原谅标题,我不知道该怎么称呼这个。 想象一下我有这个 table_ref id_x|id_y --------- 6|70 6|71 6|72 6|73 8|70 8|73 9|72 9|73 如果id_x=6&8&9匹配,我如何选择id_y? 在这种情况下,它应该返回我73 返回的id_y结果将在另一个sql查询中用作内部联接。即使在sql Server 2005上也是如此 您可以使用多个EXISTs: 这看起来不太好,但它在适当的索引下工作且有效。这个怎么样 Select blah F

请原谅标题,我不知道该怎么称呼这个。 想象一下我有这个

table_ref

id_x|id_y
---------
6|70
6|71
6|72
6|73
8|70
8|73
9|72
9|73
如果id_x=6&8&9匹配,我如何选择id_y? 在这种情况下,它应该返回我73


返回的id_y结果将在另一个sql查询中用作内部联接。

即使在sql Server 2005上也是如此

您可以使用多个EXISTs:

这看起来不太好,但它在适当的索引下工作且有效。

这个怎么样

Select blah
From OtherTable
Where id_y in ( Select id_y from table_ref where id_x in (6,8,9))
请试试这个:

select a.* from  table_ref as a
inner join table_ref as b 
        on a.id_y = b.id_y
        and b.id_x = 8
inner join table_ref as c
        on a.id_y = c.id_y
        and c.id_x = 9
where a.id_x = 6
使用内部联接:

SELECT a.id_y
FROM
  (SELECT id_x, id_y 
   FROM table_ref 
   WHERE id_x =6 )a INNER JOIN
  (SELECT  id_x, id_y 
   FROM table_ref 
   WHERE id_x =8)b on a.id_y = b.id_y
 INNER JOIN
 (SELECT id_x, id_y 
  FROM table_ref  
  WHERE id_x =9)c on b.id_y = c.id_y

此处演示:

当然,参数化很难,但如果很重要,则可以将值作为表值参数传递

SELECT T.id_y
FROM table_ref T
  JOIN (VALUES (6), (8), (9)) A(id_x)
    ON T.id_x = A.id_x
GROUP BY T.id_y
HAVING COUNT(*) = 3
这应该起作用:

SELECT          [id_y]
FROM            [table_ref]
WHERE           [id_x] IN (6, 8, 9)
GROUP BY        [id_y]
HAVING          Count(DISTINCT [id_x]) = 3
如果要从单独的表中获取值的范围,可以使用:

DECLARE @Lookup TABLE (ID INT)
INSERT INTO @Lookup VALUES (6), (8), (9)

SELECT          [id_y]
FROM            [table_ref] 
WHERE           [id_x] IN (SELECT [ID] FROM @Lookup)
GROUP BY        [id_y]
HAVING          Count(DISTINCT [id_x]) = (SELECT Count(DISTINCT [ID]) FROM @Lookup)

是的,您可以使用普通输入来实现这一点:

sqlite> SELECT * FROM table_ref;
6|70
6|71
6|72
6|73
8|70
8|73
9|72
9|73
sqlite> SELECT id_y
...> FROM table_ref t
...> WHERE id_x IN (6,8,9)
...> GROUP BY t.id_y
...> HAVING COUNT(*) = 3;
73          

如果您想要更一般的东西:

SELECT   id_y
FROM     table_ref
GROUP BY id_y
WHERE    COUNT(DISTINCT id_x)) = (SELECT COUNT(DISTINCT id_x)) FROM table_ref)


它只返回与表中每个id_x相关联的id_y值,而不管id_x的数量是多少

为什么id_x同时是6、8和9??id_x一次只有一个值,对吗?所以它将是6,8,或9。,这是表的fk,id_y是表的fk,你应该使用左连接3次这被称为关系除法。可能的重复和只使用IN没有区别,这给了我所有的y值我不完全确定你想要实现什么。在您的帖子中,您希望在指定id_x值时选择一些id_y值,并将其用作另一个查询的基础。我已经在这里证明了这一点。如果你还需要什么,尽管问吧!OP的问题措辞有点混乱,但正如其他答案所示,他在查找id_x列中所有6、8和9旁边出现的id_y。用SQL术语来说,这是--但要尽可能高效。刚刚第四次重读,我明白你在说什么了。@Yohanes,谢谢你的朋友!是的,我在很多子查询中使用了类似的查询,试图避免它,因为id_x可以是一个10-20的列表,但这看起来不错。@sharify:如果它是一个只有10-20的列表,我仍然会使用这种方法,因为它是可搜索的,需要db对其进行优化。这非常简单,因为您只需复制粘贴存在的值并替换该值。您使用的是什么版本的MS SQL Server?@sharify:我忽略了您使用的是SQL Server 2008。那么,公认的答案当然要简洁得多。@hamlet,你用过什么概念,有没有教程?我知道TVPtable values参数的基础知识。@AK47,@AK47也许你还想看看这个。这假设id_x和id_y组合在表_ref中是唯一的。它可以通过使用CountDISTINCT[T].[id_x]=3@Jodrell,这不是更好,只是你错了。你必须交换最后两行。重复行是OP的选项。但在这种情况下,如果列表更大,则使用JOIN和虚拟表比使用in子句更可取。如果有3乘以6 | 70呢?它将被选中,但这不是必需的。@jaczjill说得对。这张桌子看起来像是我所有的钥匙,我希望它有一个唯一性约束。。。从关系模型来看:有一个命题Pid_x,id_y与这个关系表_ref,这样对于表_refpid_x中的每个元组tid_x,id_y,id_y在封闭世界假设下为真。重复元组并不能使P成为真正的er。这就是为什么关系模型是用定义的,而不是SQL造成的混乱。是的,实际上我的表有很多相同id_x和/或id_y的实例,如果我在有4倍6 | 70的情况下使用它,它不会给出正确的结果,子查询为我做了这项工作。
sqlite> SELECT * FROM table_ref;
6|70
6|71
6|72
6|73
8|70
8|73
9|72
9|73
sqlite> SELECT id_y
...> FROM table_ref t
...> WHERE id_x IN (6,8,9)
...> GROUP BY t.id_y
...> HAVING COUNT(*) = 3;
73          
SELECT   id_y
FROM     table_ref
GROUP BY id_y
WHERE    COUNT(DISTINCT id_x)) = (SELECT COUNT(DISTINCT id_x)) FROM table_ref)