在哪里(......)或在(...)条款?

时间:2014-02-11 17:53:19

标签: sql-server where-clause

我想要做的是如果两个不同的表中存在ID,则将数据拉回来,例如:

select details from myTable
where myTable.id in (select id from tbl1) or myTable.id in (select id from tbl2)

到目前为止,我没有运气。我这样做了吗?如果没有,你们能提出一些方法来获得理想的结果吗?

我遇到的问题是查询挂起,我不确定这是由于格式错误的查询还是其他一些我没想到的原因。

4 个答案:

答案 0 :(得分:2)

尝试使用UNION:

SELECT details 
FROM dbo.myTable
WHERE 
    myTable.id IN (SELECT id FROM dbo.tbl1
                   UNION
                   SELECT id FROM dbo.tbl2)

答案 1 :(得分:1)

如果要检查两个表中是否存在,可以执行以下操作:

SELECT details
FROM dbo.myTable A
WHERE EXISTS (  SELECT 1
                FROM dbo.tbl1 B
                INNER JOIN dbo.tbl2 C
                   ON B.ID = C.ID
                WHERE A.ID = B.ID)

答案 2 :(得分:1)

如果id存在于tbl1或tbl2的 中,这将从myTable返回数据:

SELECT details
 from myTable mt
 where exists (select id from tbl1 where id = mt.id)
  or exists (select id from tbl2 where id = mt.id)

对于大型表,这将比基于联合的查询(假设合适的索引)执行得更好,因为您只是检查是否存在,而不是从其他表中检索数据。

答案 3 :(得分:0)

以下是仅使用连接而不使用子查询的方法:

SELECT details FROM myTable
LEFT JOIN tbl1 ON tbl1.id = myTable.id
LEFT JOIN tbl2 ON tbl2.id = myTable.id
WHERE tbl1.id IS NOT NULL OR tbl2.id IS NOT NULL

如果这仍然挂起或需要很长时间,则可能是其中一个id列上没有索引。但是,id通常是自动编入索引的主键,因此不太可能。

我应该补充一点,如果这些id列中的任何一列可以重复,即tbl1中的多个行具有相同的id,那么这将导致details的重复副本{1}}。同样,我假设所有id列都是主键,因此这不是一个问题。