В SQL Server я пытаюсь сгруппировать совпадающие строки по идентификаторам.Null считается подстановочным знаком.
Объяснение: Что означает совпадение строк?
Соответствие строк означает - только если все столбцы двух строк совпадают.
Соответствие столбца означает - то же самоезначение ('A' = 'A') или нулевое значение для каждого значения ('A' / 'B' / 'C' / ... = NULL).
В моем примере:
Строка 1 соответствует строке 2 - потому что:
First column: 'A' = 'A'
Second column: 'B' = NULL
Third column: NULL = 'C'
Строка 1 не соответствует строке 4:
First column: 'A' = 'A'
Second column: 'B' != 'D'
Third column: NULL = NULL.
Сравнение не удалось, поскольку значения во втором столбце не совпадают.
Может кто-нибудь помочь мне с SQL?
Например:
Для создания тестовой таблицы:
create table test_table
(
id int,
column1 varchar(20),
column2 varchar(20),
column3 varchar(20)
);
insert into test_table (id, column1, column2, column3) values
(1, 'A', 'B', NULL),
(2, 'A',NULL, 'C'),
(3, 'A', 'B', 'D'),
(4, NULL, 'D', NULL),
(5, 'A', 'B', 'D');
Таблица, например
Это ожидаемый результат:
group id 1: {1,2}
group id 2: {1,3,5}
group id 3: {2,4}
эти строки не могут объединиться в одну группу: {1,2,3}.
Пример ожидаемого результата в таблице:
Я попробовал этот ответ:
SELECT
T1.id as row_id,
T2.id as row_id
FROM
test_table AS T1
INNER JOIN test_table AS T2 ON
(T1.column1 = T2.column1 OR T1.column1 IS NULL OR T2.column1 IS NULL) AND
(T1.column2 = T2.column2 OR T1.column2 IS NULL OR T2.column2 IS NULL) AND
(T1.column3 = T2.column3 OR T1.column3 IS NULL OR T2.column3 IS NULL)
WHERE
T1.id < T2.id
таблица результатов:
Итак, я вижу, что строка 1 соответствуетстроки 2, 3, 5 - но я не вижу, чтобы строки 2 и 3/5 не могли объединиться в одну группу.То, что я хочу, это результат, в котором я вижу, что строки 1, 3, 5 могут быть в одной группе, потому что они все совпадают, но соответствие между строками 1 и 2 должно быть в другой группе, потому что строка 2 не совпадает со строками3 и 5.