1

我看到过类似的问题,但这略有不同。使用先前提出的问题中的建议,我无法获得预期的结果。如果这以任何方式不清楚,我深表歉意。如果您需要任何澄清,请随时询问...

我有一个 SOFTWARE 表,其中显示了可以安装的每种类型和版本的软件。有一个 MACHINE 表,其中列出了所有机器(对此不太重要......)。还有一个 MACHINE_SOFTWARE 表,它只列出一个 MACHINE_ID 和一个 SOFTWARE_ID。所以 MACHINE_SOFTWARE 表可能会显示机器 1 和软件 1,机器 1 和软件 4,机器 1 和软件 5,机器 2 和软件 1,机器 2 和软件 2,等等......

我正在编写一个查询,它将为每台机器显示四个特定软件的软件版本。

因此,对于每个 MACHINE_ID,我需要查看 SOFTWARE.VERSION 字段 4 次。

这是我无法正常工作的:

SELECT MS.MACHINE_ID, A.VERSION AS A_VERSION, B.VERSION AS B_VERSION, C.VERSION AS C_VERSION, D.VERSION AS D_VERSION
FROM MACHINE_SOFTWARE MS
LEFT JOIN SOFTWARE A ON MS.SOFTWARE_ID = A.ID AND A.DISPLAY_NAME LIKE 'SoftA%'
LEFT JOIN SOFTWARE B ON MS.SOFTWARE_ID = B.ID AND B.DISPLAY_NAME LIKE 'SoftB%'
LEFT JOIN SOFTWARE C ON MS.SOFTWARE_ID = C.ID AND C.DISPLAY_NAME LIKE 'SoftC%'
LEFT JOIN SOFTWARE D ON MS.SOFTWARE_ID = D.ID AND D.DISPLAY_NAME LIKE 'SoftD%'
4

2 回答 2

2

由于匹配是在 中的多行上进行的MACHINE_SOFTWARE,因此具有适当聚合的简单GROUP BY似乎是有序的;

SELECT MS.MACHINE_ID, 
       MAX(A.VERSION) AS A_VERSION, MAX(B.VERSION) AS B_VERSION,
       MAX(C.VERSION) AS C_VERSION, MAX(D.VERSION) AS D_VERSION
FROM MACHINE_SOFTWARE MS
LEFT JOIN SOFTWARE A ON MS.SOFTWARE_ID = A.ID AND A.DISPLAY_NAME LIKE 'SoftA%'
LEFT JOIN SOFTWARE B ON MS.SOFTWARE_ID = B.ID AND B.DISPLAY_NAME LIKE 'SoftB%'
LEFT JOIN SOFTWARE C ON MS.SOFTWARE_ID = C.ID AND C.DISPLAY_NAME LIKE 'SoftC%'
LEFT JOIN SOFTWARE D ON MS.SOFTWARE_ID = D.ID AND D.DISPLAY_NAME LIKE 'SoftD%'
GROUP BY MS.MACHINE_ID

一个用于测试的 SQLfiddle

于 2013-07-22T17:29:09.390 回答
0

为了解决您的查询,我已按以下方式进行

首先我把这3张桌子分成4张桌子,除了机器桌子我拿了3张桌子

1个软件:Software_id[pk],software_name

2 software_version:version_id[pk],Software_id[与软件有fk关系]

3 machine_software:version_id,MACHINE_ID。[ version_id + MACHINE_ID 是此表的 pk] 并且 [ version_id 与 software_version 具有 fk 关系, MACHINE_ID 与 MACHINE 表具有 fk 关系]

现在要列出任何机器上任何软件的所有可用版本,我运行以下查询

SELECT ms.`version_id` , sv.`Software_id` , s.`software_name` , ms.`MACHINE_ID` , 
FROM  `machine_software` ms
INNER JOIN  `software_version` sv ON ms.version_id = sv.version_id
AND sv.Software_id = ( 
SELECT  `Software_id` 
FROM software_version
WHERE  `version_id` = ms.`version_id` ) 
INNER JOIN  `software` s ON sv.`Software_id` = s.`Software_id` 
AND s.`software_name` = ( 
SELECT  `software_name` 
FROM  `software` 
WHERE  `Software_id` = sv.Software_id ) 
ORDER BY  `version_id` ASC 

如果您愿意,也可以在 software_version 表中添加版本名称字段,然后在查询中显示版本名称,您必须相应地添加该字段。

于 2013-07-22T19:55:28.863 回答