Извлекать записи с отличным значением одного столбца при замене другого значения столбца, когда несколько записей - PullRequest
0 голосов
/ 24 августа 2018

У меня есть 2 таблицы, которые мне нужно объединить, основываясь на различном риде, при замене значения столбца различными значениями в нескольких строках.Лучше объяснить с помощью примера, приведенного ниже.

CREATE TABLE usr (rid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(12) NOT NULL,
email VARCHAR(20) NOT NULL);

CREATE TABLE usr_loc
(rid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code CHAR NOT NULL PRIMARY KEY,
loc_id INT NOT NULL PRIMARY KEY);

INSERT INTO usr VALUES 
(1,'John','john@product'),
(2,'Linda','linda@product'),
(3,'Greg','greg@product'),
(4,'Kate','kate@product'),
(5,'Johny','johny@product'),
(6,'Mary','mary@test');

INSERT INTO usr_loc VALUES 
(1,'A',4532),
(1,'I',4538),
(1,'I',4545),
(2,'I',3123),
(3,'A',4512),
(3,'A',4527),
(4,'I',4567),
(4,'A',4565),
(5,'I',4512),
(6,'I',4567);
(6,'I',4569);

Требуемый набор результатов

+-----+-------+------+-----------------+
| rid | name  | Code |      email      |
+-----+-------+------+-----------------+
|   1 | John  | B    | 'john@product'  |
|   2 | Linda | I    | 'linda@product' |
|   3 | Greg  | A    | 'greg@product'  |
|   4 | Kate  | B    | 'kate@product'  |
|   5 | Johny | I    | 'johny@product' |
|   6 | Mary  | I    | 'mary@test'     |
+-----+-------+------+-----------------+

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

Запрос, который я придумал:

SELECT distinct(a.rid)as rid, a.name, a.email, 'B' as code 
FROM usr 
JOIN usr_loc b ON a.rid=b.rid 
WHERE a.rid IN (SELECT rid FROM usr_loc GROUP BY rid HAVING COUNT(*) > 1);`

1 Ответ

0 голосов
/ 26 августа 2018

Вам нужно сгруппировать по пользователям и посчитать, сколько у вас вхождений в usr_loc.Если их больше одного, замените code на B.Смотрите ниже:

select
    rid,
    name,
    case when cnt > 1 then 'B' else min_code end as code,
    email
  from (
    select u.rid, u.name, u.email, min(l.code) as min_code, count(*) as cnt
      from usr u
      join usr_loc l on l.rid = u.rid
      group by u.rid, u.name, u.email
  ) x;

Мне кажется, что вы используете MySQL, а не IBM DB2.Это так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...