присоединение к одной таблице многократно к другим таблицам

hg rollback, но остерегайтесь предостережений:

Эту команду следует использовать с осторожностью. Существует только один уровень отката, и нет способа отменить откат. Он также восстановит состояние dirstate во время последней транзакции, потеряв все изменения dirstate с того времени. Эта команда не изменяет рабочий каталог.
...

5
задан umar 10 June 2009 в 10:43
поделиться

6 ответов

Вы можете использовать несколько объединений для объединения нескольких таблиц:

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

Если это не отвечает на ваш вопрос, вам нужно уточнить его еще немного.

9
ответ дан 18 December 2019 в 13:18
поделиться
-- // 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
2
ответ дан 18 December 2019 в 13:18
поделиться

Как вы описали этот случай, вы только хотели знать, есть ли у кого-то ноутбук или ключ. Я бы написал запрос с подзапросом, а не с объединением:

select * 
from user 
where userid in (select userid from key union select userid from laptop)

Причина этого в том, что при объединении человек с несколькими ноутбуками или несколькими ключами будет указан несколько раз (если вы не используете разные ) . И даже если вы используете отдельный , вы получите менее эффективный запрос (по крайней мере, в Oracle оптимизатор запросов не может создать эффективный план).

[Отредактировано, чтобы исправить то, что указал Рашми Пандит.]

1
ответ дан 18 December 2019 в 13:18
поделиться
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

и так далее

1
ответ дан 18 December 2019 в 13:18
поделиться
 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
0
ответ дан 18 December 2019 в 13:18
поделиться

Решение первое:

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 или наоборот.

1
ответ дан 18 December 2019 в 13:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: