Борьба за подсчет и порядок по столбцу по ссылке в базе данных T-SQL - PullRequest
1 голос
/ 26 февраля 2012

Я не уверен, правильно ли я пишу следующий оператор SQL? (С использованием T-SQL)

У меня есть две таблицы:

Таблица 1: [dbo]. [T_Orgnzs]

[id] = INT
[nm] = NVARCHAR(256)

Таблица 2: [dbo]. [T_Usrs]

[id] = INT
[ds] = NVARCHAR(256)
[oid] = INT (referenced [dbo].[t_Orgnzs].[id])

Мне нужно выбрать элементы из Таблицы 2, упорядоченные по столбцу [oid] в порядке возрастания от 1 до 16, но выгода в том, что [oid] ссылается на строку в Таблице 1, которую мне действительно нужно вернуть как результат.

Так, скажем, если таблицы были накрыты так: Таблица 1:

id   nm
1    Name 1
2    Name 2
3    Name 3
4    Name 4

И Таблица 2:

id   ds      oid
1    A       2
2    B       4
3    C       1

Полученный запрос должен вернуть:

3 C Name 1
1 A Name 2
2 B Name 4

Итак, вот SQL, который я использую:

WITH ctx AS (
  SELECT [id],
         [ds],
         (SELECT [nm] FROM [dbo].[t_Orgnzs] WHERE [id]=[dbo].[t_Usrs].[oid]) AS organizName,
         ROW_NUMBER() OVER (ORDER BY organizName ASC) AS rowNum 
  FROM [dbo].[t_Usrs]
            )
             SELECT [id], [ds], organizName 
             FROM ctx 
             WHERE rowNum>=1 AND rowNum<=16;

И я получаю сообщение об ошибке: «Недопустимое имя столбца OrganName».

Ответы [ 3 ]

1 голос
/ 26 февраля 2012

Я не понимаю смысла использования ROW_NUMBER () в вашем случае.Почему?

CREATE TABLE [t_Orgnzs] ([id] int PRIMARY KEY, [nm] NVARCHAR(256))
GO

CREATE TABLE [t_Usrs] ([id] int, [ds] NVARCHAR(256), [oid] int FOREIGN KEY REFERENCES [t_Orgnzs]([id]))
GO

INSERT [t_Orgnzs] VALUES (1,'Name_1')
INSERT [t_Orgnzs] VALUES (2,'Name_2')
INSERT [t_Orgnzs] VALUES (3,'Name_3')
INSERT [t_Orgnzs] VALUES (4,'Name_4')
GO

INSERT [t_Usrs] VALUES (1,'A',2)
INSERT [t_Usrs] VALUES (2,'B',4)
INSERT [t_Usrs] VALUES (3,'C',1)
GO

SELECT * 
FROM [t_Orgnzs] 
INNER JOIN [t_Usrs] ON [t_Orgnzs].[id]=[t_Usrs].[oid] 
ORDER BY [oid]
0 голосов
/ 26 февраля 2012
SELECT TOP 16 * FROM [t_Orgnzs] 
INNER JOIN [t_Usrs]
ON [t_Orgnzs].[id] = [t_Usrs].[oid] 
ORDER BY [oid]
0 голосов
/ 26 февраля 2012

Как насчет этого

select id, ds, nm
from
(
    select ROW_NUMBER() OVER (ORDER BY o.nm ASC) AS rowNum, u.id, u.ds, o.nm
    from t_Usrs u inner join t_Orgnzs o on (u.oid = o.id)
) t
 WHERE rowNum>=1 AND rowNum<=16;
...