Mysql 根据表1中的列值合并两个表列在表2中的列值
我在表1中有2个columnName,数字,在表2中有4个columnName,Min,Max,Color 表1 columnNumber包含一个数值,该数值在表2min和Max中有一个范围 我的要求是根据名称列从表1中选择名称、编号和颜色 此外,若表1中的数值高于表2的最大值,则需要从颜色列中选择相同的行值Mysql 根据表1中的列值合并两个表列在表2中的列值,mysql,Mysql,我在表1中有2个columnName,数字,在表2中有4个columnName,Min,Max,Color 表1 columnNumber包含一个数值,该数值在表2min和Max中有一个范围 我的要求是根据名称列从表1中选择名称、编号和颜色 此外,若表1中的数值高于表2的最大值,则需要从颜色列中选择相同的行值 **Table1 sample data:** **Name Number** A 33 B 17 **Table2 sample data:** **N
**Table1 sample data:**
**Name Number**
A 33
B 17
**Table2 sample data:**
**Name Min Max Color**
A 0 20 RED
A 21 44 Yellow
A 45 45 Green
B 0 0.9 Green
B 1 15.99 Yellow
B 16 16 RED
**Output**
**Name Number Color**
A 33 Yellow
B 17 Red
请让我知道任何关于上述问题的困惑
注意:此查询用于Tableau中的自定义SQL,因此不能使用CTE或else advance方法。您的最终条件非常奇怪。但是,您可以简化逻辑:只需忽略max列并选择min小于或等于数字的最后一行:
select t1.*,
(select t2.color
from table2 t2
where t1.name = t2.name and t2.min <= t1.number
order by t2.min desc
limit 1
) as color
from table1 t1;
那么任何超过45的东西都是绿色的?SQLFIDDLE也不错。我在您的查询中得到以下错误消息。原因是表2返回表1中单个名称行的3行结果。Msg 512,级别16,状态1,第1行子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。我唯一的问题是,合并将与Tableau自定义SQL一起工作,还是我可以使用任何其他方法?非常感谢您的努力。@Aditya我不知道tableau是什么。COALESCE的d目的是什么?正如我在google上所做的那样,但没有成功达到实际目的。如果表y中没有对应的行,换句话说,如果table1的数字大于table2 max的对应值,查询将使用与最大值关联的颜色。合并就像IFNULL一样。
SELECT x.*
, COALESCE(y.color,z.color) color
FROM table1 x
LEFT
JOIN table2 y
ON y.name = x.name
AND x.number BETWEEN y.min AND y.max
JOIN
( SELECT a.*
FROM table2 a
JOIN
( SELECT name,MAX(max) max FROM table2 GROUP BY name ) b
ON b.name = a.name
AND b.max = a.max
) z
ON z.name = x.name;