ВЫБЕРИТЕ оператор WHERE в СОЕДИНЕНИИ

#tsql

#tsql

Вопрос:

Я пытаюсь выполнить запрос с помощью оператора SELECT в СОЕДИНЕНИИ, но не смог заставить его работать.

Таблицы, которые у меня есть, приведены ниже :

 CREATE TABLE check_result
    (id int,
    check_result_id int,
    id_relation int);
    
INSERT INTO check_result
    values(1, 12, 1), (2,9, 1),(3,13, 3);
    
CREATE TABLE relation
    (id int,
    name VARCHAR(20),
    id_group int);
    
INSERT INTO relation
    values(1, 'pietje', 1), (2,'klaasje', 1),(3,'Harry', 3);

CREATE TABLE groups
    (id int,
    name VARCHAR(20),
    id_sub int);
    
INSERT INTO groups
  values(1, 'support_worker 1',2),(2, 'support_worker 2',2),(3, 'support_worker 2',3);
 

Запрос, который у меня есть до сих пор, выглядит примерно так :

 SELECT R.name , G.name
FROM check_result CR
    LEFT JOIN relation R ON R.id = CR.id_relation
    LEFT JOIN groups G ON R.id_group = (SELECT id_sub 
                                        FROM groups 
                                        WHERE name = 'support_worker 2' 
                                        AND id_sub = R.id_group )
 

В итоге я надеялся получить 3 записи в результатах, но вместо этого их 6, с правильными результатами из групп.

Есть ли кто-нибудь, кто может показать мне, что я делаю неправильно?

Комментарии:

1. Можете ли вы добавить, какие именно ожидаемые результаты будут в табличном формате?

2. запись ‘support_worker 2’ дублируется в таблице групп с идентификаторами 2 и 3

3. Какого результата вы надеетесь достичь? Если вы можете сообщить нам, что вы надеетесь получить в терминах строк / столбцов / значений, это поможет нам предоставить вам соответствующий запрос.

Ответ №1:

С этим набором данных и без ваших ожидаемых результатов трудно дать вам четкий ответ.

     SELECT R.name , G.name
    FROM check_result CR
    LEFT JOIN relation R ON R.id = CR.id_relation
    LEFT JOIN groups G ON G.id_sub = R.id_group and G.name = 'support_worker 2' 
 

Вы упомянули, что хотите получить все 3 результата, но ваш дополнительный выбор приводил к появлению повторяющихся записей.

Разве это не тот случай, когда, как указано выше, не нужно полагаться на дополнительный выбор и просто добавлять дополнительные условия в ваше левое соединение?

Стоит упомянуть еще одну вещь — поскольку я мало что знаю о вашей структуре базы данных, но если у Groups есть идентификатор, на который ссылаются в R.id_group, тогда вам следует присоединиться к нему, а не к Id_sub, что изменило бы ваш код на:

     SELECT R.name , G.name
    FROM check_result CR
    LEFT JOIN relation R ON R.id = CR.id_relation
    LEFT JOIN groups G ON G.id = R.id_group and G.name = 'support_worker 2' 
 

Дает тот же результат при ограниченных данных.

Скрипка SQL

Комментарии:

1. спасибо, это в целом помогает!!! также помог мне в понимании…