Выбирать единственный реестр тех, у которых есть несколько дублированных полей

Хорошие, у меня есть следующая структура в базе данных

 COD_ENTIDAD     COD_IDCONTRA          COD_CONCEGES   COD_PRODGEST
--------------------------------------------------------------
1   0182    00000000000000000000000003     403Q        00126057 
2   0182    00000000000000000000000004     101AW       012600000
3   0182    00000000000000000000000004     403Q        012600000
4   0182    00000000000000000000000004     403Q        00126057 
5   0182    00000000000000000000000004     322C        012600000
6   0182    00000000000000000000000005     322C        012600000
7   0182    00000000000000000000000006     101AW       012600000

Я хочу выбрать все реестры, но те, которые считают поля COD_ENTIDAD, COD_IDCONTRA и COD_CONCEGES равными, выбрать один. Например в таблице наверху, я оставил бы себе только реестры 1, 2, 3, (4 я отпускаю, потому что 3 упомянутых поля равны реестру 3), 5, 6 и 7

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

SELECT A.*, B.COD_PRODGEST FROM 
(SELECT DISTINCT COD_ENTIDAD, COD_IDCONTRA, COD_CONCEGES
FROM BBDD) A
INNER JOIN
(SELECT COD_ENTIDAD, COD_IDCONTRA, COD_CONCEGES, COD_PRODGEST
FROM BBDD) B
ON A.COD_ENTIDAD= B.COD_ENTIDAD
AND A.COD_IDCONTRA = B.COD_IDCONTRA
AND A.COD_CONCEGES = B.COD_CONCEGES

Какая-то идея или отпечаток, поскольку он мог бы делать это?

1
задан 19.01.2017, 18:59
0 ответов

Если тебе неважно, какой дублированный реестр - тот, которого ты выбираешь, тогда ты можешь пытаться ROW_NUMBER:

SELECT *
FROM (  SELECT  A.*, 
                B.COD_PRODGEST, 
                ROW_NUMBER() OVER(PARTITION BY A.COD_ENTIDAD, A.COD_IDCONTRA, A.COD_CONCEGES
                                  ORDER BY COD_ENTIDAD) AS RN
        FROM (  SELECT DISTINCT COD_ENTIDAD, COD_IDCONTRA, COD_CONCEGES
                FROM BBDD) A
        INNER JOIN (SELECT COD_ENTIDAD, COD_IDCONTRA, COD_CONCEGES, COD_PRODGEST
                    FROM BBDD) B
            ON A.COD_ENTIDAD= B.COD_ENTIDAD
            AND A.COD_IDCONTRA = B.COD_IDCONTRA
            AND A.COD_CONCEGES = B.COD_CONCEGES) X
WHERE RN = 1
3
ответ дан 03.12.2019, 17:37
  • 1
    Большое спасибо @Lamak! Уже функционируй! Превосходный ответ. Ло ú nico, что нужно показывать в partition прозвище subquery, потому что а он дает ошибку из-за неясных полей. –  19.01.2017, 19:20
  • 2
    @DevCodeG Вся razó n, уже actualicé ответ –  19.01.2017, 19:29

Если то, что ты нуждаешься в том, чтобы возвратить, является только полями COD_ENTIDAD, COD_IDCONTRA и COD_CONCEGES таблицы, консультация осталась бы такой, который я схватил

SELECT DISTINCT (COD_ENTIDAD, COD_IDCONTRA, COD_CONCEGES) FROM Nombre_de_tabla

Я надеюсь, что он служит помощью.

0
ответ дан 03.12.2019, 17:37
  • 1
    Но op хочет все колонны, просто оставлять себе одну из тех, которые повторяют между этими 3 колоннами –  19.01.2017, 19:17
  • 2
    Привет @CecilioAlonso, он не подает меня, вот то, что я прошу. Спасибо –  19.01.2017, 19:21

Ты можешь делать это с командой DISTINCT и оно было бы чем-то как это:

SELECT DISTINCT * FROM myTable WHERE 1 = 1

В твоем случае оно было бы чем-то как

SELECT DISTINCT A.*, B.COD_PRODGEST FROM 
( /* Tu subquery aquí */)
WHERE 1= 1

Протестируй и комментируй, функционировало ли оно.

Привет

-2
ответ дан 03.12.2019, 17:37
  • 1
    Эта консультация entregará тот же результат, что posteó op –  19.01.2017, 18:54
  • 2
    tiene Distict внутри subquerys, поэтому сделав inner join, вновь удваивается, сделав это внешним способом, уже он был бы должен идти, или также смоги использовать distict в специфическом поле, которое хочет, чтобы он не удвоился. –  19.01.2017, 18:55
  • 3
    нет, неправильный. Если ты видишь результат, он замечает себе, что combinació n стоимости он ú nica, distinct не hará ничего –  19.01.2017, 18:57
  • 4
    @Lamak Ты Имеешь razó n, я виновный, не поместил команду где deberí в. Уже corregí ответ –  19.01.2017, 18:58
  • 5
    Твое изменение не traerá никакое различие, правда –  19.01.2017, 19:04