相同表之间的兼容性ID

时间:2017-07-19 18:13:51

标签: sql sql-server

我需要使用SQL 2014在ids之间创建兼容性表。

CREATE TABLE MyTable (
[FromId] int,
[ToId] int,
)

我们说我有Id 1与Id 2兼容,所以我将插入FromId 1 => ToId 2,但也是2 => 1实际上是相同的有效记录。 现在,当我尝试查询此表时,我需要能够在我要求1时检索2,而当我要求2时,即使2 =>未插入1个关系。

我是这样做的:

我以一种方式插入(例如1 => 2)并且我添加了一个触发器以避免插入2 => 1因为与1 =>相同2.我还创建了一个视图,它将返回所有可能的UNION组合,如下所示:

SELECT FromId, ToId FROM MyTable 
UNION
SELECT ToId, FromId FROM MyTable 

这对我来说很好,我只需要知道我是否因为已经做了一些事情来处理这个问题或更好的方法。

2 个答案:

答案 0 :(得分:1)

union相当昂贵。考虑到触发器强制执行的限制,您可以将其替换为union all

SELECT FromId, ToId
FROM MyTable 
UNION ALL
SELECT ToId, FromId
FROM MyTable ;

我想补充一点,您不需要触发器来强制FromId < ToId。您可以使用check约束来执行此操作。

如果你想在表中使用 关系,而不是反向关系,那么你仍然可以避免触发:

alter table mytable add minfromto as (case when fromid < toid then fromid else toid end);
alter table mytable add maxfromto as (case when fromid < toid then toid else fromid end);

create unique index unq_mytable_minfromto_maxfromto on mytable(minfromto, maxfromto);

答案 1 :(得分:0)

你可以使用一个简单的CASE,然后使用(不带触发和查看),并将搜索条件设置为'when',如下所示:

     SELECT CASE 
        WHEN FromId = 1 THEN ToId
        WHEN ToId = 1 THEN FromId
        ELSE NULL
        END AS RESULT
    FROM table
    WHERE
        FromId = 1 OR ToId = 1