2013-07-16 4 views
0

В SQL Server 2008, у меня есть таблица, которая выглядит следующим образом:SQL Group и присоединиться

ID | RefNum | Label  | Value | Status 
------------------------------------------------------ 
1  123  OrderNum   123456  0 
2  123  TrackingNum  111111  0 
3  123  ConfNum   989898  0 
4  234  OrderNum   234567  1 
5  234  TrackingNum  222222  1 
6  234  ConfNum   878787  0 
7  567  OrderNum   345678  1 
8  567  TrackingNum  333333  0 
9  567  ConfNum   767676  0 

Я хочу, чтобы выбрать все записи, где Status = 0 и Join, основанные на RefNum, к 'OrderNum' и значения меток «TrackingNum», независимо от того, является ли «OrderNum» и TrackingNum статусы 1 или 0. Например, запрос должен производить:

ID | RefNum | Label  | Value | Status |OrderNum|TrackingNum 
------------------------------------------------------------------------ 
1  123  OrderNum   123456  0 123456 111111 
2  123  TrackingNum  111111  0 123456 111111 
3  123  ConfNum   989898  0 123456 111111 
6  234  ConfNum   878787  0 234567 222222 
8  567  TrackingNum  333333  0 345678 333333 
9  567  ConfNum   767676  0 345678 333333 

Сейчас мой запрос выглядит следующим образом:

SELECT     Id 
       ,mT.RefNum 
       ,Label 
       ,Value 
       ,Status 
       ,OrderNum 
       ,TrackingNum 
FROM [dbo].[myTable] AS mT 
INNER JOIN (
    SELECT MAX(ID) As OrderRowId, RefNum, Value AS OrderNum 
    FROM [dbo].[myTable] 
    WHERE Label= 'OrderNum' 
    group by RefNum, Value) AS OrderNums 
    ON OrderNums.RefNum= mt.RefNum 
INNER JOIN (
    SELECT MAX(ID) As OrderRowId, RefNum, Value AS TrackingNum 
    FROM [dbo].[myTable] 
    WHERE Label= 'TrackingNum' 
    group by RefNum, Value) AS TrackingNums 
    ON TrackingNums.RefNum= mt.RefNum 
WHERE ProcessComplete = 0 

Это относится к работе, но требует хеш-соединения. Хотел бы кого-нибудь стрелять в дыры в этом или обеспечить более эффективное решение. Благодарю.

+0

Хеш-соединения эффективны. В чем проблема? Кстати, почему бы не просто уменьшить каждый «RefNum» до одной строки с тремя элементами информации в строке? Это похоже на разумный результат для данных такого типа. –

+0

@GordonLinoff Вы делаете отличные очки. В грандиозной схеме не очень важно иметь хеш-соединение. Мне просто интересно, может ли это поправиться. Реальная проблема заключается в том, что у меня около 25 разных лейблов, и они не всегда гарантированно будут там. Я мог бы группировать по каждой метке и refnum, но группировка и, следовательно, преобразование вывода, похоже, слишком малоинвазивно. – kakridge

ответ

0

Если не существует дубликатов номеров заказов или номеров отслеживания на номер ссылки, вы можете упростить запрос с помощью обычного LEFT JOIN или JOIN;

SELECT mt.id, mt.refnum, mt.label, mt.value, mt.status, 
     ordno.value ordernum, trackno.value trackingnum 
FROM myTable mt 
LEFT JOIN myTable ordno 
    ON ordno.label='ordernum' and mt.refnum=ordno.refnum 
LEFT JOIN myTable trackno 
    ON trackno.label='trackingnum' and mt.refnum=trackno.refnum 
WHERE mt.status = 0; 

An SQLfiddle to test with.

Если возможны дубликаты, вы можете сделать один GROUP BY, чтобы получить результат;

SELECT mt.id, mt.refnum, mt.label, mt.value, mt.status, 
     MAX(ordno.value) ordernum, MAX(trackno.value) trackingnum 
FROM myTable mt 
LEFT JOIN myTable ordno 
    ON ordno.label='ordernum' and mt.refnum=ordno.refnum 
LEFT JOIN myTable trackno 
    ON trackno.label='trackingnum' and mt.refnum=trackno.refnum 
WHERE mt.status = 0 
GROUP BY mt.id,mt.refnum,mt.label,mt.value,mt.status; 

Another SQLfiddle.

+0

Кажется, что используется вложенный цикл, тогда как внутреннее соединение использует хэш-совпадение. – kakridge

+0

Внутреннее соединение, подобное вашему, сделает план более эффективным, если вы уверены, что отслеживание # и порядок # всегда существуют. Кроме того, я не включал никаких индексов в SQLfiddle, так как трудно оптимизировать для 10 строк данных полезным способом :) –

+0

Да, я понимаю :) Эти два значения всегда будут существовать. Мне интересно, может быть, что-то вроде CTE будет более эффективным. Все, кроме этого конкретного подхода. – kakridge

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