2013-10-09 4 views
1

Предположим, что у меня есть следующая таблица:эффективный способ получить уникальные значения из записей

CREATE TABLE test(
id int identity not null primary key, 
code nvarchar(50), 
name nvarchar(50), 
node_code nvarchar(50), 
parent_node nvarchar(50), 
prop1 int, 
prop2 datetime, 
prop3 nvarchar(50) 
); 

Код и название коррелировать, и они образуют ключ к свойствам. Таким образом, таблица может содержать следующие данные:

CODE001 NAME001 [3 PROPS] 
CODE001 NAME001 [3 PROPS] 
CODE002 NAME002 [3 PROPS] 
CODE002 NAME002 [3 PROPS] 
... 

Я знаю, что это не очень хороший дизайн, но я должен жить с этим.

Вопрос в том, что я хочу получить список кодовых имен вместе с их кодом узла и кодом родительского узла (код узла уникален для кода и имени), но не со свойствами. Я могу это сделать:

select DISTINCT code, name, node_code, parent_code from test 

Но я серьезно сомневаюсь, что это самый эффективный способ. Мне нужны предложения.

+0

выберите код, имя, node_code, parent_code из опытной группы по коду, названию, node_code, parent_code. Вот как я получаю уникальные значения вместо использования отдельных. Донно о самом эффективном методе. – zundarz

ответ

0

Вы можете сделать это:

SELECT code, name, node_code, parent_code ,prop1, prop2, prop3 FROM 
(
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY code, name, node_code, parent_code ORDER BY code, name, node_code, parent_code) AS RN, 
     code, name, node_code, parent_code,prop1,prop2,prop3 
    FROM test 
) TEST2 
WHERE TEST2.RN = 1 

Вы можете учиться больше об этом here

+0

Спасибо за ваш ответ, но этот SQL-запрос выглядит очень медленным и содержит 2 миллиона записей. Следующий SQL довольно быстрый (1 секунда): выберите a.code, (выберите первое имя из теста, где code = a.code), (выберите top 1 node_code из теста, где code = a.code), (выберите top 1 parent_code из теста, где code = a.code) из теста заказать по a.code – nim

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