2013-07-08 6 views
1

Каждая запись может содержать до 40 различных полей person_user.description. Проблема в том, что я получаю повторяющиеся строки, потому что записи имеют несколько записей описания. Можете ли вы помочь мне поставить эти дополнительные дубликаты на той же строке, как рекорд:Не удается удалить повторяющиеся строки

| 1 | badge.bid | person.first_name | person.last_name | person.type | 1 | 2 | 3 | 4 | 5 | и т.д. | 40 | | 2 | badge.bid | person.first_name | person.last_name | person.type | 1 | 2 | 3 | 4 | 5 | и т.д | 40 | | 3 | badge.bid | person.first_name | person.last_name | person.type | 1 | 2 | 3 | 4 | 5 | и т.д | 40 |

вместо этого:

| 1 | badge.bid | person.first_name | person.last_name | person.type | person_user.description | | 1 | badge.bid | person.first_name | person.last_name | person.type | person_user.description | | 2 | badge.bid | person.first_name | person.last_name | person.type | person_user.description | | 2 | badge.bid | person.first_name | person.last_name | person.type | person_user.description |

SELECT person.id, 
     badge.bid, 
     person.first_name, 
     person.last_name, 
     person.type, 
     person_user.description 
FROM person, 
     badge, 
     person_user 
WHERE person.id = badge.id 
     AND person.id = person_user.person_id 
     AND badge.bid NOT LIKE "111%" 
     AND badge.access_date >= 20130401 
GROUP BY person.id, 
      badge.bid, 
      person.first_name, 
      person.last_name, 
      person.type, 
      person_user.description 
ORDER BY person.id 

ответ

0

Вы можете использовать функцию listagg(), чтобы избавиться от проблемы множественной строк; однако он не будет помещать каждое описание в отдельные столбцы, как вы описали в своем вопросе. Вместо этого он будет помещать все описания в один столбец в виде строки, разделенной указанными вами символами. В приведенном ниже примере отделит описания запятой и пространства:

SELECT person.id, 
     badge.bid, 
     person.first_name, 
     person.last_name, 
     person.type, 
     listagg(person_user.description, ', ') within group (order by person_user.description) 
FROM person, 
     badge, 
     person_user 
WHERE person.id = badge.id 
     AND person.id = person_user.person_id 
     AND badge.bid NOT LIKE "111%" 
     AND badge.access_date >= 20130401 
GROUP BY person.id, 
      badge.bid, 
      person.first_name, 
      person.last_name, 
      person.type 
ORDER BY person.id 
+0

Я пробовал эту команду, но, к сожалению, это было признано. –

+0

Какую версию SQL вы используете? – Hue

+0

Это Informix, как четко указывают теги вопроса. И Informix не имеет встроенной функции LISTAGG. Можно добавить [GROUP_CONCAT] (http://stackoverflow.com/questions/715350/show-a-one-to-many-relationship-as-2-columns-1-unique-row-id-comma-separate/716655 # 716655) для Informix. Непонятно, что это то, что нужно. Вместо 1 колонки с до 40 подполей желаемый результат, по-видимому, составляет 40 отдельных столбцов. –

0

Для достижения этой цели, в Informix вам необходимо определить свою собственную агрегатную функцию следующую these instructions.

1

Получил это. Вот как я это сделал, кстати.

SELECT P.id, 
     B.bid, 
     P.first_name, 
     P.last_name, 
     PT.description, 
     PU1.description PU1, 
     PU2.description PU2, 
     PU3.description PU3, 
     PU4.description PU4, 
     PU5.description PU5, 
     PU6.description PU6, 
     PU7.description PU7, 
     PU8.description PU8, 
     PU9.description PU9, 
     PU10.description PU10, 
     PU11.description PU11, 
     PU12.description PU12, 
     PU13.description PU13, 
     PU14.description PU14, 
     PU15.description PU15, 
     PU16.description PU16, 
     PU17.description PU17, 
     PU18.description PU18, 
     PU19.description PU19, 
     PU20.description PU20, 
     PU21.description PU21, 
     PU22.description PU22, 
     PU23.description PU23, 
     PU24.description PU24, 
     PU25.description PU25, 
     PU26.description PU26, 
     PU27.description PU27, 
     PU28.description PU28, 
     PU29.description PU29, 
     PU30.description PU30, 
     PU31.description PU31, 
     PU32.description PU32, 
     PU33.description PU33, 
     PU34.description PU34, 
     PU35.description PU35, 
     PU36.description PU36, 
     PU37.description PU37, 
     PU38.description PU38, 
     PU39.description PU39, 
     PU40.description PU40 
FROM person P, 
    OUTER badge B, 
      person_type PT, 
      OUTER person_user PU1, 
       OUTER person_user PU2, 
         OUTER person_user PU3, 
          OUTER person_user PU4, 
            OUTER person_user PU5, 
             OUTER person_user PU6, 
               OUTER person_user PU7, 
                OUTER person_user PU8, 
                  OUTER person_user PU9, 
                   OUTER person_user PU10, 
                     OUTER person_user PU11, 
                      OUTER person_user PU12, 
                        OUTER person_user PU13, 
                         OUTER person_user PU14, 
                           OUTER person_user PU15, 
                            OUTER person_user PU16, 
                              OUTER person_user PU17, 
                               OUTER person_user PU18, 
                                 OUTER person_user PU19, 
                                  OUTER person_user PU20, 
                                    OUTER person_user PU21, 
                                     OUTER person_user PU22, 
                                       OUTER person_user PU23, 
                                        OUTER person_user PU24, 
                                          OUTER person_user PU25, 
                                           OUTER person_user PU26, 
                                             OUTER person_user PU27, 
                                              OUTER person_user PU28, 
                                                OUTER person_user PU29, 
                                                 OUTER person_user PU30, 
                                                   OUTER person_user PU31, 
                                                    OUTER person_user PU32, 
OUTER person_user PU33, 
     OUTER person_user PU34, 
      OUTER person_user PU35, 
        OUTER person_user PU36, 
         OUTER person_user PU37, 
           OUTER person_user PU38, 
            OUTER person_user PU39, 
              OUTER person_user PU40 
WHERE P.id=B.person_id 
AND P.type=PT.id 
AND (P.id=PU1.person_id 
    AND PU1.slot_number=1) 
AND (P.id=PU2.person_id 
    AND PU2.slot_number=2) 
AND (P.id=PU3.person_id 
    AND PU3.slot_number=3) 
AND (P.id=PU4.person_id 
    AND PU4.slot_number=4) 
AND (P.id=PU5.person_id 
    AND PU5.slot_number=5) 
AND (P.id=PU6.person_id 
    AND PU6.slot_number=6) 
AND (P.id=PU7.person_id 
    AND PU7.slot_number=7) 
AND (P.id=PU8.person_id 
    AND PU8.slot_number=8) 
AND (P.id=PU9.person_id 
    AND PU9.slot_number=9) 
AND (P.id=PU10.person_id 
    AND PU10.slot_number=10) 
AND (P.id=PU11.person_id 
    AND PU11.slot_number=11) 
AND (P.id=PU12.person_id 
    AND PU12.slot_number=12) 
AND (P.id=PU13.person_id 
    AND PU13.slot_number=13) 
AND (P.id=PU14.person_id 
    AND PU14.slot_number=14) 
AND (P.id=PU15.person_id 
    AND PU15.slot_number=15) 
AND (P.id=PU16.person_id 
    AND PU16.slot_number=16) 
AND (P.id=PU17.person_id 
    AND PU17.slot_number=17) 
AND (P.id=PU18.person_id 
    AND PU18.slot_number=18) 
AND (P.id=PU19.person_id 
    AND PU19.slot_number=19) 
AND (P.id=PU20.person_id 
    AND PU20.slot_number=20) 
AND (P.id=PU21.person_id 
    AND PU21.slot_number=21) 
AND (P.id=PU22.person_id 
    AND PU22.slot_number=22) 
AND (P.id=PU23.person_id 
    AND PU23.slot_number=23) 
AND (P.id=PU24.person_id 
    AND PU24.slot_number=24) 
AND (P.id=PU25.person_id 
    AND PU25.slot_number=25) 
AND (P.id=PU26.person_id 
    AND PU26.slot_number=26) 
AND (P.id=PU27.person_id 
    AND PU27.slot_number=27) 
AND (P.id=PU28.person_id 
    AND PU28.slot_number=28) 
AND (P.id=PU29.person_id 
    AND PU29.slot_number=29) 
AND (P.id=PU30.person_id 
    AND PU30.slot_number=30) 
AND (P.id=PU31.person_id 
    AND PU31.slot_number=31) 
AND (P.id=PU32.person_id 
    AND PU32.slot_number=32) 
AND (P.id=PU33.person_id 
    AND PU33.slot_number=33) 
AND (P.id=PU34.person_id 
    AND PU34.slot_number=34) 
AND (P.id=PU35.person_id 
    AND PU35.slot_number=35) 
AND (P.id=PU36.person_id 
    AND PU36.slot_number=36) 
AND (P.id=PU37.person_id 
    AND PU37.slot_number=37) 
AND (P.id=PU38.person_id 
    AND PU38.slot_number=38) 
AND (P.id=PU39.person_id 
    AND PU39.slot_number=39) 
AND (P.id=PU40.person_id 
    AND PU40.slot_number=40) 
AND B.status=0 
AND B.bid NOT LIKE "111%" 
AND B.access_date>=20130401 
ORDER BY P.id, 
     P.last_name 
+0

SQL уродливый как грех - за все это работает! Я бы не отступал от таких предложений в OUTER; они все на одном уровне. Я бы поставил каждое условие соединения на одну строку. И я, вероятно, использовал бы явный LEFT JOIN вместо унифицированных в стиле Informix (нестандартных, старомодных) OUTER. Я также не убежден, что понял бы, что это ваше требование от вопроса. –

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