2010-05-07 1 views
3

Может кто-нибудь, пожалуйста, просветит меня, чтобы отфильтровать подзапрос, который находится в предложении FROM? Я хотел бы, чтобы это выглядело примерно так:TSQL - TOP X в FROM Подзапрос?

SELECT * 
FROM TABLE_A 
LEFT JOIN (TOP 8 TABLE_B) ON TABLE_B.id = TABLE_A.id 
+0

Вы должны изменить принятый ответ на вопрос Ремуса Русану. Раджа дает неверный ответ в целом. – N8allan

ответ

1

Пожалуйста, попробуйте следующее:

SELECT 
column_names 
FROM 
TABLE_A A LEFT JOIN (SELECT TOP 8 column_names FROM TABLE_B) as B 
on A.Id=B.ID 

Вопросы:

Не использовать *, так как это приведет к ограничениям производительности.

Если вы обеспокоены только идентификатор затем получить только идентификатор из TABLE_B

HTH

2
SELECT * 
FROM TableA 
LEFT JOIN (SELECT TOP 8 * FROM TableB) B 
    ON B.id=TableA.id 
4
SELECT * 
FROM TABLE_A AS a 
LEFT JOIN (SELECT TOP 8 id, field1, field2 
      FROM TABLE_b) AS b 
    ON a.id = b.id 

Должно работать.

+0

Вот где я застрял. Если есть способ разместить фильтр в подзапросе, тогда я золотой. Проблема в том, что TOP 8 этой таблицы не содержит идентификатор, который я фильтрую в основном запросе. – EWizard

+0

@EWizard -что заставляет вас думать, что вы не можете использовать предложение where в этом подзапросе/производной таблице? –

+0

О, я знаю, что могу, определенно. Это просто не статический идентификатор, который мне нужен. Это примерно так: Таблица A - таблица сотрудников с EMPID в качестве ключа. TableB - зависимая таблица с внешним ключом, являющимся EMPID. TableB имеет несколько EMPID, которые имеют 15 зависимых. Я хочу только топ 8. Итак, в вашем коде выше, если бы я мог отфильтровать 8 иждивенцев на основе соответствующей формы EMPID, то основной запрос тогда я был бы золотым. – EWizard

2

Вы могли бы рассмотреть другой подход, такие как:

SELECT * FROM TABLE_A WHERE TABLE_A.ID IN (SELECT TOP 8 ID FROM TABLE_B) 
0

вы можете использовать ORDER BY, и даже сделать TOP N использовать переменную:

declare @x table (rowid int) 
declare @y table (rowid int) 
INSERT @x (rowID) SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 
INSERT @y (rowID) SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 
DECLARE @z int 
SET @z=2 

SELECT 
    a.*, b.* 
    FROM @x a 
     LEFT JOIN (SELECT TOP (@z) 
         * 
         FROM @y 
         ORDER BY rowid 
       ) b ON a.rowid=b.rowid 

ВЫВОД:

rowid  rowid 
----------- ----------- 
1   1 
2   2 
3   NULL 
4   NULL 
5   NULL 
6   NULL 
7   NULL 
8   NULL 

(8 row(s) affected) 

EDIT на основе комментариев OPs:

Проблема состоит в том, что ТОП 8 этого таблицы не содержит идентификатор, который я утра фильтрации в основном запросе.

declare @x table (rowid int) 
declare @y table (rowid int) 
INSERT @x (rowID) SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 
INSERT @y (rowID) SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 
DECLARE @z int 
SET @z=2 

SELECT 
    a.*, b.* 
    FROM @x a 
     LEFT JOIN (SELECT 
         *, ROW_NUMBER() OVER(ORDER BY rowid) AS RowNumber 
         FROM @y 
       ) b ON a.rowid=b.rowid 
    WHERE b.RowNumber<[email protected] 

ВЫВОД:

rowid  rowid  RowNumber 
----------- ----------- -------------------- 
6   6   1 
7   7   2 

(2 row(s) affected) 
17

Если вам необходимо соотнести подзапрос, то вам нужно использовать APPLY вместо JOIN:

SELECT * 
FROM TABLE_A 
CROSS APPLY (
SELECT TOP (8) * 
FROM TABLE_B 
WHERE TABLE_B.id = TABLE_A.id 
ORDER BY ...) AS B; 

Это даст вам верхние 8 строк от B для каждой строки в A. Другие решения, которые я вижу в курсе, предоставят вам JOIN между A и global TOP 8 от B

+0

спасибо за это сообщение. Я просто провел 30 минут, преследуя свой хвост, потому что я сделал плохую работу по вырезанию и вставке - удалив * от моего предложения select top (1) ... Я, наконец, отказался от призрака и googled; которые ведут меня к вашему посту. Так рада, что это было здесь. – plditallo

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

  • Нет связанных вопросов^_^