T-SQL 在不同行的不同列中的一列中查找值

T-SQL Find value in one column in different column on different row

这个很难解释,所以我会尽力的。

我有这个 table(存在其他列但与我的查询无关)。

CREATE TABLE ClientRelationships
(
    Client1 VARCHAR(10) NOT NULL,
    Client2 VARCHAR(10) NULL
)

INSERT INTO ClientRelationships (Client1, Client2)
VALUES ('C12345', 'C67890'),
       ('C54353', 'C76345'),
       ('C76345', 'C54353'),
       ('C73246', NULL), 
       ('C67890', 'C12345')
客户端 1 客户端2
C12345 C67890
C54353 C76345
C76345 C54353
C73246
C67890 C12345

从数据中可以看出,有几行Client1的值在另一行中显示为Client2。在这些情况下,我要做的是将第一次出现标记为“主要”,将第二次出现标记为“次要”(其中 Client1 值位于不同行的 Client2 列中)。也许就像一个名为“Primary”的布尔列设置为 0 或 1。

如果 Client2 列中没有值 (NULL),主列将设置为 1

我的示例数据的结果应该是这样的。

客户端 1 客户端2 小学
C12345 C67890 1
C54353 C76345 1
C76345 C54353 0
C73246 1
C67890 C12345 0

希望这是有道理的。

我正在使用 SQL Server 2019,但可以满足 2012 年及更高版本的任何需求,因为我拥有所有实例。

记录并不总是同时出现在table。

我真的不确定如何处理这个问题,所以寻求一些建议。

如果有定义行顺序的列,例如 ID,那么您可以使用 CASE 表达式和 EXISTS:

SELECT c1.*,
       CASE 
         WHEN EXISTS(SELECT 1 FROM ClientRelationships c2 WHERE c2.ID < c1.ID AND c2.Client2 = c1.Client1) THEN 0
         ELSE 1
       END [Primary]
FROM ClientRelationships c1

或者,使用相关子查询:

SELECT c1.*,
       (
         SELECT COALESCE(MAX(0), 1) 
         FROM ClientRelationships c2 
         WHERE c2.ID < c1.ID AND c2.Client2 = c1.Client1
       ) [Primary]
FROM ClientRelationships c1

参见demo