如何通过优化查询插入反向关系

时间:2018-01-31 07:12:46

标签: sql tsql

我有一张桌子(下面给出的样本),我有像cid_i这样的关系 - > cid_j有一些值Val

我想插入反向关系cid_j - > cid_i具有相同的val,即cid_i - > cid_j。

这是业务要求,我必须以同样的方式提供该表。我试过,下面是我的查询。我不想重复,所以我使用相关的子查询来解决这个问题。

是否有任何优化方法可以做到这一点。

请建议。

declare @tbl table (cid_i int, cid_j int, val float )

insert into @tbl (cid_i , cid_j ,val)
values(1,2,0.5),(1,3,0.6),(2,1,0.5) 



insert into @tbl  (cid_i , cid_j ,val)
select cid_j , cid_i,val   from @tbl a 
where cid_j not in (select cid_i from @tbl b  where b.cid_j=a.cid_i)

select * from @tbl

2 个答案:

答案 0 :(得分:2)

我想我会使用EXCEPT

INSERT INTO @tbl (cid_i , cid_j ,val)
SELECT cid_j, cid_i ,val
FROM @tbl t0

EXCEPT 

SELECT cid_i , cid_j ,val
FROM @Tbl 

然而,正如daniel.shih的回答所指出的,保留这些记录是多余的,因为可以使用union轻松选择相反的关系。

答案 1 :(得分:1)

我认为您可以使用UNION来制作它。

重点是

  
      
  1. 首先选择查询为SELECT cid_j,cid_i,val from @tbl
  2.   
  3. Seconde选择查询为SELECT cid_i,cid_j,val from @tbl
  4.   

您可以切换要反转的选择字段。

DECLARE @tbl table (cid_i int, cid_j int, val float )

INSERT INTO @tbl (cid_i , cid_j ,val)
VALUE(1,2,0.5),(1,3,0.6),(2,1,0.5) 
SELECT cid_j,cid_i,val  from @tbl
UNION 
SELECT cid_i,cid_j,val   from @tbl