2012-04-30 2 views
0
TableBoxes       TableItems 
BoxCode BoxDesc     ItemNo BoxCode  ItemDesc 
    X1  Freight1     123  X1   Tomatoes 
    X4  Freight2     124  X1   Apples 
    X8  Freight3     128  X4   Potatoes 

Я хочу строку результата для BoxCode = только X1, с выходом по заказу ITEMNORowNumber on join?

BoxNumber   ItemNo    ItemDesc 
    1    1      Tomatoes 
    1    2      Apples 

Я могу легко получить серийную работу в 'ITEMNO' с помощью row_number() на ITEMNO. Как найти серию ящиков из первой таблицы? Мой текущий запрос

select 
    row_number() over(
      order by a.ItemNo 
    )as ItemNo 
    ,ItemDesc 
from 
    TableItems a 
    inner join TableBoxes b 
     on a.BoxCode=b.BoxCode 
where 
    a.BoxCode='X1' 

не могу понять, как выбрать последовательный для BoxCode, Дэмиен.

ответ

2

Это то, что вы хотите?

WITH TableBoxesRanked AS (
    SELECT 
    *, 
    BoxNumber = ROW_NUMBER() OVER (ORDER BY BoxCode) 
    FROM TableBoxes 
) 
SELECT 
    b.BoxNumber, 
    ItemNumber = ROW_NUMBER() OVER (ORDER BY i.ItemNo), 
    i.ItemDesc 
FROM TableItems i 
    INNER JOIN TableBoxesRanked b ON i.BoxCode = b.BoxCode 
WHERE a.BoxCode = 'X1' 
+0

WOULD'NT первый запуск запроса на весь стол в первую очередь? Например, сначала присвойте номер строки всем строкам в первой таблице, тогда он будет запускать выбор в результирующем наборе с помощью предложения where? Скажем, у меня есть тысячи строк в первой таблице, возможно ли это решение? –

+1

Логически, да, я бы ожидал, что так будет, потому что вы не можете узнать количество «BoxCode» в таблице, не пройдя всю таблицу. Тем не менее, для реализации вместо поиска таблицы может использоваться поиск индекса (если существует соответствующий индекс в 'BoxCode'). (То есть, если я правильно понимаю ваши требования.) –

+0

Спасибо за объяснение Andriy M, это было действительно информативно. –

1

Использование DENSE_RANK(), как показано ниже:

SELECT DENSE_RANK() OVER(order by a.BoxCode) , row_number() over(order by a.ItemNo)as ItemNo, ItemDesc 
from #TableItems a 
inner join #TableBoxes b on a.BoxCode=b.BoxCode where a.BoxCode in ('X1','X4')