如果2个表具有重叠列,则获取重叠记录

时间:2016-06-12 20:13:56

标签: sql sql-server sql-server-2012

我有一个复杂的查询,可以返回10000多条记录。

我希望能够根据2个表过滤查询。我只想在表2中的任何记录也存在于表2中时选择记录。

例如,如果我的表1和表2是这样的话。

表1。

ID
1
2
3
5
6
7

表2。

ID
100
200
1
300
600

我想选择记录。但是,如果表1和表2是这样的话。我不想选择记录。因为表1和表2没有重叠。

表1。

ID
1
2
3
5
6
7

表2。

ID
100
200
500
300
600

我的select语句看起来像这样:

SELECT * FROM SOMETABLE AS S
WHERE OVERLAP (SELECT ID IN TABLE1 WHERE S.PID = PID)
              (SELECT ID IN TABLE2 WHERE S.PID = PID)

6 个答案:

答案 0 :(得分:0)

如果相交不为空,则来自table1的所有记录? 那样的东西?

select id from table1 where
(
  select
      count(*)
  from
      (
         select id from table1
         intersect
         select id from table2
      )
)>0

答案 1 :(得分:0)

我认为他正在寻找唯一的交叉点

select id from table1
intersect
select id from table2

答案 2 :(得分:0)

;WITH overlap AS
(
SELECT 
a.id as id_overlap
FROM table1 a
inner join table2 b on a.ID = b.ID
)
SELECT
    *
FROM SOMETABLE S,overlap op
where S.id = op.id_overlap

试试这段代码我希望它能帮到你

答案 3 :(得分:0)

如果id在两个表中是唯一的,您似乎想要这样:

SELECT S.*
FROM SOMETABLE S
WHERE (SELECT ID IN TABLE1 WHERE S.PID = PID) = (SELECT ID IN TABLE2 WHERE S.PID = PID)

你可以做类似的事情,即使它不是唯一的(尽管问题中的答案是唯一的)。

答案 4 :(得分:0)

SELECT *

FROM Table1 tab1

INNER JOIN Table2 tab2

ON tab1.ID = tab2.ID

SELECT *

FROM Table1

WHERE ID IN(从表2中选择ID)

答案 5 :(得分:0)

如果在三个表中的任何一个表中只有一行具有给定PID,例如SOMETABLETABLE1TABLE2,您只需使用内部联接,即join。如果PIDTABLE1中存在多个具有给定TABLE2的行,则使用exists可能会有所帮助。

例如,这是联接:

select *
from SOMETABLE a
join TABLE1 b
    on a.PID = b.PID
join TABLE2 c
    on a.PID = c.PID;

这是使用存在。这只会返回SOMETABLE中具有相同PIDexists子查询中的结果集的不同行。

select *
from SOMETABLE a
where exists (
    select *
    from TABLE1 b
    join TABLE2 c
        on b.PID = c.PID
    where a.PID = b.PID);

希望这有帮助。