Два соединения изменяют размер кейса - PullRequest
1 голос
/ 03 июля 2019

Мой вопрос: почему двойные объединения в SQLite изменяют размер регистра в результате? Пожалуйста, посмотрите в скрипке: http://sqlfiddle.com/#!7/88671/3

Как вы можете видеть, когда я запрашиваю "выбрать * у пользователя", у меня есть имя верхнего размера A123456, но когда я выполняю двойное соединение, у меня только имя меньшего размера a123456.

Может кто-нибудь объяснить, почему?

Схема ниже:

CREATE TABLE user (id integer primary key, n_login varchar(64), name varchar(128), CONSTRAINT a UNIQUE (n_login, name) ON CONFLICT IGNORE);

CREATE TABLE role (id integer primary key, name text unique, description text);

CREATE TABLE user_to_role (user_id integer REFERENCES user(id), role_id integer REFERENCES role(id), PRIMARY KEY (user_id, role_id));

CREATE TABLE role_to_database (id integer, role_id integer REFERENCES role(id), database_id integer REFERENCES databases(id), PRIMARY KEY (role_id, database_id));

insert into user (n_login, name) values ("a123456", "A123456");
insert into user (n_login, name) values ("a123456", "a123456");
insert into user (n_login, name) values ("a000000", "A000000");
insert into user_to_role (user_id, role_id) values (2, 1);
insert into user_to_role (user_id, role_id) values (2, 2);
insert into user_to_role (user_id, role_id) values (3, 3);
insert into role_to_database (role_id, database_id) values (1, 3);
insert into role_to_database (role_id, database_id) values (2, 8);
insert into role_to_database (role_id, database_id) values (3, 1);

С этим запросом у меня есть A123456:

select * from user;

С этим запросом у меня также A123456:

select * from role_to_database inner join user_to_role ON role_to_database.role_id = user_to_role.role_id inner join user;

Но с этим запросом у меня есть только a123456:

select * from role_to_database inner join user_to_role ON role_to_database.role_id = user_to_role.role_id inner join user ON user.id = user_to_role.user_id;

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Запрос возвращает именно введенные данные:

insert into user_to_role (user_id, role_id) values (2, 1);
insert into user_to_role (user_id, role_id) values (2, 2);
insert into user_to_role (user_id, role_id) values (3, 3);

, поскольку user_id=1 не играет роли.

Вы имели в виду

insert into user_to_role (user_id, role_id) values (1, 1); -- 1
insert into user_to_role (user_id, role_id) values (2, 2);
insert into user_to_role (user_id, role_id) values (3, 3);

?Тогда вы тоже получите 'A123456'.

0 голосов
/ 03 июля 2019

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

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