2012-02-26 1 views
1

Я не уверен, правильно ли я написал следующий оператор SQL? (С помощью T-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; 

И я получаю сообщение об ошибке: «Неверное имя столбца« имя_организации ».»

+0

Я немного запутался. Для вашего результата вы можете просто использовать соединение, не так ли? –

+0

Знаете, я не так хорош с SQL. Или, может быть, уже слишком поздно ... Как бы вы это сделали? – ahmd0

ответ

0

Как об этом один

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; 
+0

Ха-ха. Мне, наверное, нужно остановиться и ложиться спать. Благодаря! – ahmd0

1

Я не понимаю смысл использования 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

ROW_NUMBER() необходим для извлечения элементов N из M (от 1 до 16 в моем примере), но это может быть почти все, например, от 20 до 30. – ahmd0

0
SELECT TOP 16 * FROM [t_Orgnzs] 
INNER JOIN [t_Usrs] 
ON [t_Orgnzs].[id] = [t_Usrs].[oid] 
ORDER BY [oid] 
+0

Спасибо, действительно, TOP 16 будет работать, но мне нужен более сложный пример извлечения, скажем, от 20 до 30 элементов и т. Д. – ahmd0

Смежные вопросы