Как отфильтровать и упорядочить по строке, которая существует в той же таблице? - PullRequest
0 голосов
/ 23 мая 2019

У меня есть простая таблица с 2 столбцами "id" и "ink_number", и я хотел бы создать еще один столбец с именем "nk_exists", который будет иметь значение 1 или 0 в зависимости от того, есть ли строка, подобная этой, но с «НК» в начале. И сможете сортировать по "nk_exits".

Например, если есть две строки "123" и "NK123", то для строки "123" nk_exists имеет значение true, поскольку существует строка 123 с NK в начале.

Вот мой оригинальный стол "Инкассо"

+-------+--------------+
| id  1 |  ink_number  |
+-------+--------------+
|     1 | 538032S      |
|     2 | NK538032S    |
|     3 | 114702A      |
|     4 | 159631D      |
|     5 | NK9761926001 |
|     6 | 9761926001   |
|     7 | 29-00002411L |
|     8 | 42032502V    |
|     9 | NK42032502V  |
|    10 | 454339KDB    |
+-------+--------------+

Я хочу, чтобы конечный результат выглядел следующим образом

+-------+--------------+-----------+
| id  1 |  ink_number  | nk_exists |
+-------+--------------+-----------+
|     1 | 538032S      |         1 |
|     2 | NK538032S    |         0 |
|     3 | 114702A      |         0 |
|     4 | 159631D      |         0 |
|     5 | NK9761926001 |         0 |
|     6 | 9761926001   |         1 |
|     7 | 29-00002411L |         0 |
|     8 | 42032502V    |         1 |
|     9 | NK42032502V  |         0 |
|    10 | 454339KDB    |         0 |
+-------+--------------+-----------+

Мой запрос получает ошибку Synax

1064 - у вас ошибка в синтаксисе SQL; проверьте правильность синтаксиса в руководстве, соответствующем версии вашего сервера MariaDB

select
    inkasso.id,
    inkasso.ink_number,
    jointable.nk_exists
from inkasso
left join (
    select
        case
            when exists 1
            when not exists 0
        end as nk_exists
    from inkasso
    where exists(
        select
            1
        from inkasso ink
        where left(ink_number, 2) = 'NK' and inkasso.id = ink.id
    ) as subjoin on 
) as jointable on inkasso
WHERE jointable.nk_exists = 1
ORDER BY jointable.nk_exists

Ответы [ 2 ]

2 голосов
/ 23 мая 2019
SELECT *,
  CONCAT('NK', ink_number) IN (SELECT ink_number FROM inkasso) AS nk_exists
FROM inkasso;

Fiddle

1 голос
/ 23 мая 2019

Если вы хотите добавить столбец nk_exists, вы можете попробовать что-то вроде этого:

SELECT          ink.id,
                ink.ink_number,
                CASE
                  WHEN nk_ink.id IS NULL THEN 0
                  ELSE                        1
                END AS nk_esists
FROM            inkasso ink
LEFT OUTER JOIN inkasso nk_ink
             ON nk_ink.ink_number = 'NK' + ink.ink_number

Если вы хотите фильтровать в этом столбце, вы можете попробовать следующее:

SELECT ink.id,
       ink.ink_number,
FROM   inkasso ink
WHERE  EXISTS (SELECT nk_ink.id
               FROM   inkasso nk_ink
               WHERE  nk_ink.ink_number = 'NK' + ink.ink_number)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...