hg rollback
, но остерегайтесь предостережений:
Эту команду следует использовать с осторожностью. Существует только один уровень отката, и нет способа отменить откат. Он также восстановит состояние dirstate во время последней транзакции, потеряв все изменения dirstate с того времени. Эта команда не изменяет рабочий каталог.
...
Вы можете использовать несколько объединений для объединения нескольких таблиц:
select *
from user u
left join key k on u.userid = k.userid
left join laptop l on l.userid = u.userid
«Левое соединение» также находит пользователей, у которых нет ключа или портативного компьютера. Если вы замените оба значения на «внутреннее соединение», будут найдены только пользователи с портативным компьютером и ключом.
Когда «левое соединение» не найдет строку, оно вернет NULL в своих полях. Таким образом, вы можете выбрать всех пользователей, у которых есть ноутбук или ключ, например:
select *
from user u
left join key k on u.userid = k.userid
left join laptop l on l.userid = u.userid
where k.userid is not null or l.userid is not null
NULL является особенным, поскольку вы сравниваете его как «field is not null» вместо «field <> null».
Добавлено после ваш комментарий: скажем, у вас есть настольная мышь, которая связана с ноутбуком, но не с пользователем. Вы можете присоединиться к нему, например:
select *
from user u
left join laptop l on l.userid = u.userid
left join mouse m on m.laptopid = l.laptopid
Если это не отвечает на ваш вопрос, вам нужно уточнить его еще немного.
-- // Assuming that a user can have at max 1 items of each type
SELECT u.*
-- // Assuming that a user can have more then 1 items of each type, just add DISTINCT:
-- // SELECT DISTINCT u.*
FROM "User" u
LEFT JOIN "Key" u1 ON u.UserID = u1.UserID
LEFT JOIN "Laptop" u2 ON u.UserID = u2.UserID
LEFT JOIN "Server" u3 ON u.UserID = u3.UserID
-- // ...
WHERE COALESCE(u1.UserID, u2.UserID, u3.UserID /*,...*/) IS NOT NULL
Как вы описали этот случай, вы только хотели знать, есть ли у кого-то ноутбук или ключ. Я бы написал запрос с подзапросом, а не с объединением:
select *
from user
where userid in (select userid from key union select userid from laptop)
Причина этого в том, что при объединении человек с несколькими ноутбуками или несколькими ключами будет указан несколько раз (если вы не используете разные
) . И даже если вы используете отдельный
, вы получите менее эффективный запрос (по крайней мере, в Oracle оптимизатор запросов не может создать эффективный план).
[Отредактировано, чтобы исправить то, что указал Рашми Пандит.]
select distinct u.userid, u.username
from User u
left outer join Key /* k on u.userid = k.userid */
left outer join Laptop /* l on u.userid = l.userid */
where k.userid is not null or l.userid is not null
РЕДАКТИРОВАТЬ "Основная проблема заключается в том, что в реальном сценарии существует около двенадцати объединений таблиц, например: "выбрать .. Из левого соединения b на (...), c присоединиться к d на (..), e, f, g где ...", и я вижу, что a может быть присоединено к b, а a также может быть присоединено к f. Итак, предполагая, что я не могу заставить таблицы a, b и f отображаться рядом, как мне написать запрос sql? »
Вы можете иметь столько левых внешних объединений, сколько требуется. Присоединитесь к таблице с первичный ключ к остальным таблицам или к любому другому полю, где значения полей одной таблицы должны соответствовать значениям полей другой таблицы.
например, объяснит лучше, чем слова
select *
from a
left outer join b on a.pk = b.fk -- a pk should match b fk
left outer join c on a.pk = c.fk -- a pk should match c fk
left outer join d on c.pk = d.fk -- c pk should match d fk
и так далее
SELECT *
FROM User
LEFT JOIN Key ON User.id = Key.user_id
LEFT JOIN Laptop ON User.id = Laptop.user_id
WHERE Key.id IS NOT NULL OR Laptop.id IS NOT NULL
Решение первое:
SELECT * FROM [User] u
INNER JOIN [Key] k
ON u.userid = k.userid
UNION
SELECT * FROM [User] u
INNER JOIN Laptop l
ON u.userid = l.userid
[...]
Решение второе:
SELECT * FROM [User] u
LEFT JOIN [Key] k
ON u.userid = k.userid
LEFT JOIN Laptop l
ON u.userid = l.userid
LEFT JOIN [...]
WHERE k.userid IS NOT NULL
OR l.userid IS NOT NULL
OR [...]
Просто предположение, вы также можете проверить план выполнения для двух тезисов, чтобы узнать, тяжелее ли UNION-1 или наоборот.