Mysql 八个表中的多个JOIN和SELECT语句
我试图创建一个SQL语句,它接受八个不同的数字,并从一个数据库中搜索八个不同的表以获得相应的值。我不断得到无效的语法,但我不明白为什么。这是我的密码:Mysql 八个表中的多个JOIN和SELECT语句,mysql,sql,labview,Mysql,Sql,Labview,我试图创建一个SQL语句,它接受八个不同的数字,并从一个数据库中搜索八个不同的表以获得相应的值。我不断得到无效的语法,但我不明白为什么。这是我的密码: SELECT cable_length.ID, drawing.ID, optional.ID, output_type.ID, pressure_range.ID, pressure_type.ID, series.ID, termination.ID FROM ( SELECT value AS cable_length FROM
SELECT cable_length.ID, drawing.ID, optional.ID, output_type.ID, pressure_range.ID, pressure_type.ID, series.ID, termination.ID
FROM
(
SELECT value AS cable_length FROM A1 WHERE A1.id = %s
JOIN SELECT value AS drawing FROM A2 WHERE A2.id = %s,
JOIN SELECT value AS optional FROM A3 WHERE A3.id = %s,
JOIN SELECT value AS output_type FROM A4 WHERE A4.id = %s,
JOIN SELECT value AS pressure_range FROM A5 WHERE A5.id = %s,
JOIN SELECT value AS pressure_type FROM A6 WHERE A6.id = %s,
JOIN SELECT value AS series FROM A7 WHERE A7.id = %s,
JOIN SELECT value AS termination FROM A8 WHERE A8.id = %s
);
%s将仅更改为数字。每个表中的列名是“ID”和“Value”。我想按“ID”搜索并返回“Value”。表格名称为电缆长度等。非常感谢您的帮助 如果您知道所有8个值都存在,您可以这样加入:
SELECT A1.value as cable_length
, A2.value as drawing
, A3.value as optional
, A4.value as output_type
, A5.value as pressure_range
, A6.value as pressure_type
, A7.value as series
, A7.value as termination
FROM A1, A2, A3, A4, A5, A6, A7, A8
WHERE A1.ID = %s
AND A2.ID = %s
AND A3.ID = %s
AND A4.ID = %s
AND A5.ID = %s
AND A6.ID = %s
AND A7.ID = %s
AND A8.ID = %s
如果您不知道这一点,但可以保证第一个值是存在的,那么您的查询必须变得更加丑陋,因为您需要左连接
SELECT A1.value as cable_length
, A2.value as drawing
, A3.value as optional
, A4.value as output_type
, A5.value as pressure_range
, A6.value as pressure_type
, A7.value as series
, A7.value as termination
FROM A1
LEFT JOIN A2
ON A2.ID = %s
LEFT JOIN A3
ON A3.ID = %s
LEFT JOIN A4
ON A4.ID = %s
LEFT JOIN A5
ON A5.ID = %s
LEFT JOIN A6
ON A6.ID = %s
LEFT JOIN A7
ON A7.ID = %s
LEFT JOIN A8
ON A8.ID = %s
WHERE A1.ID = %s
如果没有一个值是保证存在的,则hack将有一个子查询,它是一个由8个查询组成的UNION ALL
,返回8个列,其中只有一个已填充,然后选择每个列的MAX
作为该列名
这是一个可怕的技巧,我在过去使用过它来避免许多只偶尔连接的左连接出现性能问题
顺便提一下,8个名为A1..A8的表表明,您需要有数据库经验的人来检查您的设计,并为您提供更好的布局。也许这就是您想要的。也许不是,我只是重写了你的问题:
SELECT
cable_length.ID,
drawing.ID,
optional.ID,
output_type.ID,
pressure_range.ID,
pressure_type.ID,
series.ID,
termination.ID
FROM (SELECT ID FROM A1 WHERE A1.id = %s) AS cable_length
JOIN (SELECT ID FROM A2 WHERE A2.id = %s) AS drawing
JOIN (SELECT ID FROM A3 WHERE A3.id = %s) AS optional
JOIN (SELECT ID FROM A4 WHERE A4.id = %s) AS output_type
JOIN (SELECT ID FROM A5 WHERE A5.id = %s) AS pressure_range
JOIN (SELECT ID FROM A6 WHERE A6.id = %s) AS pressure_type
JOIN (SELECT ID FROM A7 WHERE A7.id = %s) AS series
JOIN (SELECT ID FROM A8 WHERE A8.id = %s) AS termination;
在这种情况下,UNION ALL将起作用,但它可能不是最好的解决方案,更不用说混乱了(参见@btilly提供的答案)。还要注意,这是SQL Server语法,可能与MySql略有不同
select max(cable_length), max(drawing), max(optional), max(output_type), max(pressure_range), max(pressure_type), max(series), max(termination)
from
(
SELECT value as cable_length, null, null, null, null, null, null, null, null
FROM cable_length WHERE id = %s
UNION ALL
SELECT null, value as drawing, null, null, null, null, null, null, null
FROM drawing WHERE id = %s
UNION ALL
SELECT null, null, value as optional, null, null, null, null, null, null
FROM optional WHERE id = %s
UNION ALL
SELECT null, null, null, value as output_type, null, null, null, null, null
FROM output_type WHERE id = %s
UNION ALL
SELECT null, null, null, null, value as pressure_range, null, null, null
FROM pressure_range WHERE id = %s
UNION ALL
SELECT null, null, null, null, null, value as pressure_type, null, null
FROM pressure_type WHERE id = %s
UNION ALL
SELECT null, null, null, null, null, null, value as series, null
FROM series WHERE id = %s
UNION ALL
SELECT null, null, null, null, null, null, null, value as termination
FROM termination WHERE id = %s
);
您的流程不正确。那里的条件总是最终到来。请将连接语句括在()中,并在第一个表中使用on子句将它们连接起来。您在
SELECT
子句中列出了许多似乎不存在的列。请将这些连接的选项放在括号中,并为它们命名:join(SELECT…,其中a.id=…)作为连接的表3
您没有on
语法,表是如何连接的?我在原始查询中没有看到连接,可能他只想知道所有可能的组合:)当我尝试运行它时,我得到:表'labview\u test.A1'不存在您的八个表是什么?在最初的查询中,您使用了A1、A2、。。A8.我的八个表是电缆长度、图纸、可选、输出类型、压力范围、压力类型、系列、终端当我运行此程序时,它返回:表'labview\u test.A1'不存在使用实际表名而不是A1、A2等。我偏离了您的问题描述。这些表没有命名为A1..A8。这些表是同一数据库中的电缆长度等。每个表中的值都是“ID”和“Value”。b通常,当我将A1、A2等更改为表名时,我会得到:labview\u test。可选的\u Value'不会exist@user1486004然后编写optional.value甚至labview\u test.optional.value,而不是labview\u test.optional\u value。我给出的SQL的形式是正确的。您的架构我无法帮助您,因为我没有它可供参考。您无法选择*
使用这种方法,您需要选择max(电缆长度)作为电缆长度,max(绘图)作为绘图,
将其折叠回一行。@b如果ID是主键,则不需要,否则,是的,您可能是对的。我现在还不知道,因为我们不知道表的结构。如果ID是主键,那么最终会有8行,每个行有7个空值,而不是一行有所有8个值。这就是max
hack的全部要点。@btilly-gotcha,在最终输出中。谢谢