假设我有以下表结构:
main_id |类型|信息
first segway excellent
second car mercedes
third bike sliceofwind
id |等级
1 excellent
2 bad
3 (...)
id |品牌
1 mercedes
2 honda
3 (...)
id |轮胎
1 sliceofwind
2 flatasfaque
3 (...)
我想做的是根据table1 中的类型从dinamically获取不同表格中的信息。
以下是我尝试过的查询的一般示例
SELECT (CASE
WHEN table1.type = 'segway' AND segway.grade = table1.information
THEN segway.id,
WHEN table1.type = 'car' AND car.brand = table1.information
THEN car.id,
WHEN table1.type = 'bike' AND bike.tires = table1.information
THEN bike.id
END) AS information
FROM table1,segway,bike,car WHERE table1.main_id IN ("ids")
此查询的结果是笛卡尔积,因为尽管案例中存在限制,但所有表中的所有数据都将被检索,因为并非所有表都有限制。 我想知道是否有办法在不改变表结构的情况下解决这个问题,如果没有请求一些提示! (我有些讨厌的sql东西,我在这里问的是否确实可能这样做,尽管它被建议与否以及为什么!)。
答案 0 :(得分:1)
这可能是一种方法。
SELECT t1.*
FROM table1 t1
LEFT JOIN segway s
on T1.main_id = s.id and T1.type= 'segway'
LEFT JOIN car c
on T1.main_id = c.id and T1.type= 'car'
LEFT JOIN bike b
on T1.main_id = b.id and T1.type= 'bike'
WHERE t1.main_ID in (SomeList)
当Table1的类型不匹配时,segway,car和bike table列将为null。 但是,这似乎会为您提供比您需要的更多的数据/列。我认为你最好在数据库外编写单独的查询,并根据他们选择的值调用它们。或者使用数据库中的过程和条件逻辑来返回所需的结果集。 (再次在数据库中有3个单独的查询和条件逻辑)但是如果不了解用例,我真的不能说哪个更好。
我们可以将品牌,轮胎和等级进一步分类到“价值”领域,如
Select t1.*, coalese(s.grade,c.brand,b.tires) as value
但我不确定这会提供任何帮助。
如果我们只需要返回表1的值并从其他表中设置值...你说的是淫,而不是我。
我看不出笛卡尔会如何发生这种情况。
答案 1 :(得分:0)
这将是您的预期结果,请尝试此查询..
SELECT (CASE WHEN s.`id` IS NOT NULL THEN s.`id`
WHEN c.`id` IS NOT NULL THEN c.`id`
WHEN b.`id` IS NOT NULL THEN b.`id`
END) AS information FROM table1 AS t1
LEFT JOIN segway s ON t1.type= 'segway'
LEFT JOIN car c ON t1.type= 'car'
LEFT JOIN bike b ON t1.type= 'bike'
WHERE t1.main_ID IN (1, 2, 3) AND (t1.information = s.`grade` OR
t1.`information`=c.brand OR
t1.`information`=b.tires);