Неверный порядок Rownum после объединения - SQL Server - PullRequest
0 голосов
/ 25 сентября 2018

http://sqlfiddle.com/#!18/97fbe/1 - скрипка

Я пытался максимально полно продемонстрировать свой сценарий из реальной жизни

Таблицы:

CREATE TABLE [OrderTable] 
(
    [id] int,
    [OrderGroupID] int,
    [Total] int,
    [fkPerson] int,
    [fkitem] int

    PRIMARY KEY (id)
) 

INSERT INTO [OrderTable] (id, OrderGroupID, Total ,[fkPerson], [fkItem]) 
VALUES
  ('1', '1', '20', '1', '1'),
  ('2', '1', '45', '2', '2'),
  ('3', '2', '32', '1', '1'),
  ('4', '2', '30', '2', '2'),
  ('5', '2', '32', '1', '1'),
  ('6', '2', '32', '3', '1'),
  ('7', '2', '32', '4', '1'),
  ('8', '2', '32', '4', '1'),
  ('9', '2', '32', '5', '1');

CREATE TABLE [Person] 
(
    [id] int,
    [Name] varchar(32)

    PRIMARY KEY (id)
) 

INSERT INTO [Person] (id, Name) 
VALUES
  ('1', 'Fred'),
  ('2', 'Sam'),
  ('3', 'Ryan'),
  ('4', 'Tim'),
  ('5', 'Gary');

CREATE TABLE [Item] 
(
    [id] int,
    [ItemNo] varchar(32),
    [Price] int

    PRIMARY KEY (id)
) 

INSERT INTO [Item] (id, ItemNo, Price) 
VALUES
  ('1', '453', '23'),
  ('2', '657', '34');

Запрос:

WITH TABLE1 AS 
(
    SELECT 
        -- P.ID AS [PersonID], 
        -- P.Name, 
        SUM(OT.[Total]) AS [Total], 
        i.[id] AS [ItemID],
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rownum,
        ot.fkperson,
        [fkItem]
    FROM 
        OrderTable OT
    -- INNER JOIN Person P ON P.ID = OT.fkperson
    INNER JOIN 
        Item I ON I.[id] = OT.[fkItem]
    GROUP BY 
        -- P.ID, P.Name,
        i.id, ot.fkperson, [fkItem]
)
SELECT 
    t1.[fkperson],
    P.[Name],
    t1.[itemid],
    t1.[total],
    t1.[rownum]
    -- Totalrows = (SELECT MAX(rownum) FROM TABLE1)
FROM 
    TABLE1 T1
INNER JOIN 
    Person P ON P.ID = T1.fkperson
INNER JOIN 
    Item I ON I.[id] = T1.[fkItem]

Результат:

| fkperson | Name | itemid | total | rownum |
+----------+------+--------+-------+--------+
|        1 | Fred |      1 |    84 |      1 |
|        3 | Ryan |      1 |    32 |      2 |
|        4 |  Tim |      1 |    64 |      3 |
|        5 | Gary |      1 |    32 |      4 |
|        2 |  Sam |      2 |    75 |      5 |

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

INNER JOIN 
    Person P ON P.ID = T1.fkperson
INNER JOIN 
    Item I ON I.[id] = T1.[fkItem]

работает нормально.

| fkperson | Name | itemid | total | rownum |
|----------|------|--------|-------|--------|
|        1 | Fred |      1 |    84 |      4 |
|        3 | Ryan |      1 |    32 |      3 |
|        4 |  Tim |      1 |    64 |      5 |
|        5 | Gary |      1 |    32 |      1 |
|        2 |  Sam |      2 |    75 |      2 |

Кто-нибудь получил какие-либо советы о том, как объединение будет вызыватьэти странные порядковые номера?Или укажи мне правильное направление.Спасибо

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Любая реляционная база данных по своей природе неупорядочена - и вы не получите гарантированный заказ UNLESS , который вы явно запрашиваете - с помощью предложения ORDER BY в вашем внешнем запросе.

Вам необходимо явно добавить ORDER BY - например:

WITH TABLE1 AS 
(
    .....
)
SELECT 
    (list of columns ....)
FROM 
    TABLE1 T1
INNER JOIN 
    Person P ON P.ID = T1.fkperson
INNER JOIN 
    Item I ON I.[id] = T1.[fkItem]
ORDER BY 
    T1.rownum
0 голосов
/ 25 сентября 2018

Вы используете order by (select null).Это означает неопределенный порядок .И порядок может меняться от одного вызова запроса к другому.

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

...