T-SQL Находит значение в одном столбце в другом столбце в другой строке

#sql-server #compare #case

Вопрос:

Это трудно объяснить, поэтому я сделаю все, что в моих силах.

У меня есть эта таблица (существуют другие cols, но они не имеют отношения к моему запросу).

 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 в другой строке). Может быть, просто как логический столбец под названием «Основной», установленный в 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 года и выше, может быть удовлетворено, так как у меня есть экземпляры всех.

Записи не всегда отображаются в таблице одновременно.

Я действительно не уверен, как подойти к этому, поэтому ищу несколько советов.

Комментарии:

1. Существует ли столбец, например идентификатор или дата, который определяет порядок строк?

Ответ №1:

Если есть столбец, определяющий порядок строк , например an 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
 

Смотрите демонстрацию.

Комментарии:

1. Спасибо за помощь, это именно то, что мне нужно. К сожалению, столбца идентификатора нет (он взят из CSV-файла), но я могу добавить его с помощью row_number(). Теперь это мой код, и он отлично работает. ;WITH c1 AS ( SELECT ROW_NUMBER() OVER (ORDER BY Client1) AS ID , Client1, Client2 FROM ClientRelationships ) SELECT c1.*, CASE WHEN EXISTS(SELECT 1 FROM c1 c2 WHERE c2.ID < c1.ID AND c2.Client2 = c1.Client1) THEN 0 ELSE 1 END [Primary] FROM c1