Связь между строками по уникальному номеру - PullRequest
0 голосов

Я пытаюсь создать связь между 4 строками. Мне нужно, чтобы строка имела уникальный номер. Также в моей следующей вставке я не буду снова указывать тот же номер.

Пример

ID   Name    uniqueNumber
-------------------------
 1   test1       1
 2   test2       1
 3   test3       1
 4   test4       1
 5   test1       5
 6   test2       5
 7   test3       5
 8   test4       5

Мне нужно кое-что, как создать отношение между строками в одной и той же области видимости.

I Интересно, могу ли я использовать первый идентификатор строки вставки и использовать его в следующих 3. Есть ли эта опция в SQL Сервер?

Ответы [ 2 ]

3 голосов
/ 04 апреля 2020

В отличие от других комментариев и ответов, я не вижу, как последовательность будет полезна здесь. Если вам нужно выбрать, этот запрос должен работать.

select 
    ID,
    Name,   
    case when ID % 4 = 0 then ID -3 else (ID - ID % 4) + 1 end as UniqueNumber
from YourTable

Или вы можете обновить таблицу позже с помощью следующего запроса.

update YourTable
set UniqueNumber = case when ID % 4 = 0 then ID -3 else (ID - ID % 4) + 1 end

Это производит вывод, как это.

1   test1   1
2   test2   1
3   test3   1
4   test4   1
5   test1   5
6   test2   5
7   test3   5
8   test4   5
9   test1   9
10  test2   9
11  test3   9
12  test4   9
13  test1   13
14  test2   13
15  test3   13
16  test4   13
1 голос
/ 04 апреля 2020

Мне неясно, что вы действительно хотите сделать, но вот что я думаю о

SELECT *, ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Id) % 4 UniqueNumber
FROM
(
  VALUES
  (1,'test1'),
  (2,'test2'),
  (3,'test3'),
  (4,'test4'),
  (5,'test1'),
  (6,'test2'),
  (7,'test3'),
  (8,'test4')
) T(Id, Name)
ORDER BY Id

Возвращает:

+----+-------+--------------+
| Id | Name  | UniqueNumber |
+----+-------+--------------+
|  1 | test1 |            1 |
|  2 | test2 |            1 |
|  3 | test3 |            1 |
|  4 | test4 |            1 |
|  5 | test1 |            2 |
|  6 | test2 |            2 |
|  7 | test3 |            2 |
|  8 | test4 |            2 |
+----+-------+--------------+

Или, может быть, лучше использовать SEQUENCE как

CREATE SEQUENCE MySec
    AS INT   
    START WITH 1  
    INCREMENT BY 1  
    MINVALUE 1  
    MAXVALUE 4  
    CYCLE;

CREATE TABLE T(
  Id INT IDENTITY(1, 1),
  Name VARCHAR(45),
  UniqueNumber  INT DEFAULT (NEXT VALUE FOR MySec)
);

INSERT T(Name)
  VALUES
  ('test1'),
  ('test2'),
  ('test3'),
  ('test4'),
  ('test1'),
  ('test2'),
  ('test3'),
  ('test4');

SELECT * FROM T;

Лучший способ использования вычисляемого столбца как

CREATE TABLE TT(
  Id INT IDENTITY(1, 1),
  Name VARCHAR(45),
  UniqueNumber AS (Id - (Id - 1) % 4) 
);

INSERT TT(Name)
  VALUES
  ('test1'),
  ('test2'),
  ('test3'),
  ('test4'),
  ('test1'),
  ('test2'),
  ('test3'),
  ('test4'),
  ('test1'),
  ('test2'),
  ('test3'),
  ('test4'),
  ('test1'),
  ('test2'),
  ('test3'),
  ('test4');

SELECT * FROM TT;
...