我在"徒步旅行"数据库让我们说表1被称为" Forest"和表2被称为" Mountain"。两个表都有FOREIGN KEY
" Trip_id"这是表中的PRIMARY KEY
" Trip" (或其他东西,这是一个组成的例子),AUTO_INCREMENT
。旅行可以是Mountain或Forest,因此2个表不共享任何Trip_ids。
我想要SELECT * FROM
森林或山区,具体取决于哪一个具有某个值的Trip_id
(假设为74)。
SELECT * FROM FOREST OR MOUNTAIN WHERE Trip_id = 74 EXISTS;
(我知道这段代码是垃圾,完全错了,但我希望它有助于说明我的目标)。
答案 0 :(得分:2)
假设它们具有相同的列,请使用union all
:
select m.*
from mountains m
where m.trip_id = 74
union all
select f.*
from forests f
where f.trip_id = 74;
答案 1 :(得分:0)
SELECT Forest.Trip_id, Hikes.Trip_id
FROM Forest, Hikes
WHERE Forest.Trip_id OR Hikes.Trip_id = 74;
答案 2 :(得分:0)
您最好的选择是在一个带有类型代码的表中包含您的所有位置(或实际数据库中的任何情况)。如果它们是异构对象,那么您可以使用一种模式,其中您有一个共享表,每个类型具有1:1关系的各个表。例如,Destinations
(包含山脉和森林之间共享的数据),destination_id
表中的Hikes
,然后是Mountains
的表(具有特定的数据)到山脉)和Forests
,每个都有一个destination_id
也是它的主键。
除此之外,您可以这样做:
SELECT
H.name,
CASE
WHEN M.mountain_id IS NOT NULL THEN M.name
WHEN F.forest_id IS NOT NULL THEN F.name
ELSE NULL
END AS destination_name
FROM
Hikes H
LEFT OUTER JOIN Mountains M ON M.mountain_id = H.destination_id
LEFT OUTER JOIN Forests F ON F.forest_id = H.destination_id
WHERE
H.destination_id = 74
根据我的经验,你会继续遇到这种结构的问题。