2013-11-06 3 views
1

Я пытаюсь вернуть объединенный список всех запросов клиентов, назначенных каждому клиенту, причем для каждого ключа клиента (CUS_PK) возвращается только одна строка. Следующий запрос дает мне информацию, которую я ищу, но когда нескольким приглашениям присваивается один клиент, я получаю повторяющиеся строки, причем каждая строка идентична, за исключением того, что клавиши приглашения возвращаются во всех возможных комбинациях, с одной строкой на комбинацию. Я знаю, это связано с тем, что я использую объединения, но я не знаю достаточно о SQL, чтобы придумать другой способ сделать это.SQL Join Возвращает повторяющиеся результаты

Вот запрос я использую:

select CUS1.CUS_PK, 
CLP1.CLP_PRM_FK || CASE WHEN CLP2.CLP_PRM_FK <> '' THEN ', ' ELSE '' END || 
CLP2.CLP_PRM_FK || CASE WHEN CLP3.CLP_PRM_FK <> '' THEN ', ' ELSE '' END || 
CLP3.CLP_PRM_FK || CASE WHEN CLP4.CLP_PRM_FK <> '' THEN ', ' ELSE '' END || 
CLP4.CLP_PRM_FK AS 'AP' 

FROM ecrs.Customers CUS1 

LEFT OUTER JOIN ecrs.CustomerLinkPOSPrompts CLP1 ON (CLP1.CLP_CUS_FK = CUS1.CUS_PK) 
LEFT OUTER JOIN ecrs.CustomerLinkPOSPrompts CLP2 ON (CLP2.CLP_CUS_FK = CUS1.CUS_PK AND CLP2.CLP_PRM_FK<>CLP1.CLP_PRM_FK) 
LEFT OUTER JOIN ecrs.CustomerLinkPOSPrompts CLP3 ON (CLP3.CLP_CUS_FK = CUS1.CUS_PK AND CLP3.CLP_PRM_FK<>CLP2.CLP_PRM_FK AND CLP3.CLP_PRM_FK<>CLP1.CLP_PRM_FK) 
LEFT OUTER JOIN ecrs.CustomerLinkPOSPrompts CLP4 ON (CLP4.CLP_CUS_FK = CUS1.CUS_PK AND CLP4.CLP_PRM_FK<>CLP3.CLP_PRM_FK AND CLP4.CLP_PRM_FK<>CLP2.CLP_PRM_FK AND CLP4.CLP_PRM_FK<>CLP1.CLP_PRM_FK) 

ORDER BY CUS1.CUS_PK 

GROUP BY, похоже, не имеют никакого эффекта.

повторяющиеся строки выглядят так, переходя от 0-3 быстрых результатов:

CUS_PK AP 
----- ----- 
35331 
35274 40 
35342 37, 65 
35342 65, 37 
35344 37, 53, 65 
35344 53, 65, 37 
35344 37, 65, 53 
35344 53, 37, 65 
35344 65, 53, 37 
35344 65, 37, 53 

Кроме того, как я мог бы указать порядок, в котором возвращаются на запросы?

Спасибо!

+0

возможно дубликат [Объединить множество строк в одной текстовой строки?] (HTTP: //stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string) – jmoreno

+0

..Чтобы уточнить, вы хотите вернуть отдельные CUS_PK и AP, но если AP содержит значения (которые вы concatenated), которые являются одинаковыми (хотя и в другом порядке), чем вы хотите исключить эту строку? – Milan

+0

Милан: Да, это то, что я пытаюсь сделать. – user2655542

ответ

0

Try присоединиться к ним в определенном порядке (например, с помощью '< =' вместо '<>'):

LEFT OUTER JOIN ecrs.CustomerLinkPOSPrompts CLP1 ON (CLP1.CLP_CUS_FK = CUS1.CUS_PK) 
LEFT OUTER JOIN ecrs.CustomerLinkPOSPrompts CLP2 ON (CLP2.CLP_CUS_FK = CUS1.CUS_PK AND CLP2.CLP_PRM_FK <= CLP1.CLP_PRM_FK) 
LEFT OUTER JOIN ecrs.CustomerLinkPOSPrompts CLP3 ON (CLP3.CLP_CUS_FK = CUS1.CUS_PK AND CLP3.CLP_PRM_FK <= CLP2.CLP_PRM_FK AND CLP3.CLP_PRM_FK <= CLP1.CLP_PRM_FK) 
LEFT OUTER JOIN ecrs.CustomerLinkPOSPrompts CLP4 ON (CLP4.CLP_CUS_FK = CUS1.CUS_PK AND CLP4.CLP_PRM_FK <= CLP3.CLP_PRM_FK AND CLP4.CLP_PRM_FK <= CLP2.CLP_PRM_FK AND CLP4.CLP_PRM_FK <= CLP1.CLP_PRM_FK) 
+0

Это решает проблему с повторяющимися строками, но теперь я получаю повторяющиеся результаты в конкатенированном поле. Например, с одним совпадением я получаю «44,44,44,44» вместо «44», как раньше. Есть идеи? Я ценю вашу помощь. – user2655542

+0

изменение <= в < – wxyz

+0

Теперь я, кажется, снова получаю повторяющиеся строки, но каждая последующая строка теряет один результат. Поэтому я могу получить три строки для CUS_PK = 35344, но они выглядят как «65,53,37/53,37/37». – user2655542

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