Sql server 在(…)或(…)条款中的什么地方?

Sql server 在(…)或(…)条款中的什么地方?,sql-server,where-clause,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) 到目前为止,我一点运气都没有。我这样做对吗?如果不是的话,你们能建议一些方法让我得到想要的结果吗 我遇到的问题是查询挂起,我不确定这是否是由于错误的查询或我没有想到的其他原因造成的。尝试使用联合: SELECT d

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

select details from myTable
where myTable.id in (select id from tbl1) or myTable.id in (select id from tbl2)
到目前为止,我一点运气都没有。我这样做对吗?如果不是的话,你们能建议一些方法让我得到想要的结果吗

我遇到的问题是查询挂起,我不确定这是否是由于错误的查询或我没有想到的其他原因造成的。

尝试使用联合:

SELECT details 
FROM dbo.myTable
WHERE 
    myTable.id IN (SELECT id FROM dbo.tbl1
                   UNION
                   SELECT id FROM dbo.tbl2)
尝试使用联合:

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

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

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)

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

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)

如果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)

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

如果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)

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

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

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
,那么这将导致
详细信息的重复。同样,我假设所有的
id
列都是主键,因此这不会成为问题。

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

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
,那么这将导致
详细信息的重复。同样,我假设所有的
id
列都是主键,所以这不会是一个问题。

您有什么问题?查询是否没有返回您认为应该返回的数据,或者是在执行时挂起的数据,或者是其他什么?如果它需要同时存在于两者中,您是否考虑使用AND而不是or?如果是其他情况,也许您可以向我们展示您的期望(样本数据和期望结果是什么),或者“没有任何运气”是什么意思。@AaronBertrand否,所讨论的ID只需要存在于tbl1或tbl2中,因此我的“或”在该实例中是正确的。我遇到的问题是,查询挂起,我不确定这是否是由于错误的查询或我没有想到的其他原因造成的。不,错误的查询会立即返回错误。查询通常会“挂起”(A)因为它被阻止,或者(b)因为它使用的是效率极低的执行计划。你检查过堵塞吗?在任何一个表上都有索引吗?它们是什么?每个表有多少行?估计的执行计划会告诉你它将要做什么?@AaronBertrand我接受了下面的答案,但我遇到的TBL缺少索引。也解决了这些问题,多亏了你你有什么问题?查询是否没有返回您认为应该返回的数据,或者是在执行时挂起的数据,或者是其他什么?如果它需要同时存在于两者中,您是否考虑使用AND而不是or?如果是其他情况,也许您可以向我们展示您的期望(样本数据和期望结果是什么),或者“没有任何运气”是什么意思。@AaronBertrand否,所讨论的ID只需要存在于tbl1或tbl2中,因此我的“或”在该实例中是正确的。我遇到的问题是,查询挂起,我不确定这是否是由于错误的查询或我没有想到的其他原因造成的。不,错误的查询会立即返回错误。查询通常会“挂起”(A)因为它被阻止,或者(b)因为它使用的是效率极低的执行计划。你检查过堵塞吗?在任何一个表上都有索引吗?它们是什么?每个表有多少行?估计的执行计划会告诉你它将要做什么?@AaronBertrand我接受了下面的答案,但我遇到的TBL缺少索引。多亏了你,这些问题也解决了