我有一张桌子(下面给出的样本),我有像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
答案 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
来制作它。
重点是
- 首先选择查询为
SELECT cid_j,cid_i,val from @tbl
- Seconde选择查询为
醇>SELECT cid_i,cid_j,val from @tbl
您可以切换要反转的选择字段。
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