[英]INNER JOIN not returning results
大家下午好! 我已经为此工作了两天,却不知道为什么它不起作用。 我尝试了几种不同的方法来获得正确的结果,或者返回太多或为0。我有两个表,用于跟踪具有以下布局的资产:
表:资产管理
id | serial | idcode
---|--------|-------
1 | 123 | 4
2 | 1234 | 4
表格:AssetManagement_History
id | rowID | action | occurred
---|--------|-----------|-------------
1 | 1 | shipping | 2014-04-01
2 | 1 | stocked | 2014-04-02
3 | 1 | installed | 2014-04-03
4 | 2 | stocked | 2014-04-04
在此示例中,AssetManagement_History.rowID与AssetManagment.id相关,因此您可以看到第一个资产有三个历史记录详细信息,而第二个资产只有一个历史记录详细信息。 我需要退还上次操作对应于“库存”或“重新库存”的所有资产-因此仅应退还第二项资产。 这是我尝试过的几个mySQL语句:
SELECT tblASSET.id,tblASSET.serial
FROM AssetManagement tblASSET
INNER JOIN
(SELECT occurred,max(id) id
FROM AssetManagement_History GROUP BY occurred) tblAH ON tblASSET.id = tblAH.rowID
WHERE tblASSET.idcode='4' AND tblAH.action IN ('stocked','restocked')
另一尝试:
SELECT tblASSET.id,tblASSET.serial
FROM AssetManagement tblASSET
INNER JOIN
(SELECT max(rowID) rowID
FROM AssetManagement_History GROUP BY occurred) tblAH ON tblAH.rowID = tblASSET.id
WHERE tblASSET.idcode='4'
我还有其他几个人,但是他们也没有工作。 任何帮助将不胜感激!
谢谢戴夫
SELECT
A.id,
A.serial
FROM AssetManagement A
INNER JOIN ( -- Join to get our latest history ID
SELECT
H.rowID,
MAX(H.ID) ID
FROM AssetManagement_History H
GROUP BY H.rowID
) H1
ON H1.rowID = A.id
INNER JOIN AssetManagement_History H2 -- Join to get the row for the latest history
ON H2.ID = H1.ID
WHERE
H2.action IN ('stocked', 'restocked')
AND
A.IDCode = 4
SELECT tblASSET.id,tblASSET.serial
FROM AssetManagement AS tblASSET
INNER JOIN AssetManagement_History AS tblAH
ON tblAH.rowID = tblASSET.id
WHERE tblASSET.idcode='4'
您收到什么错误消息? 您希望您的结果看起来像什么?
尝试使用NOT EXISTS
,(注释中有解释)
SELECT tblASSET.id, tblASSET.serial
FROM AssetManagment AS tblASSET
INNER JOIN AssetManagement_History AS tblAH
ON tblAH.rowID = tblASSET.id
WHERE tblASSET.idcode = '4'
AND tblAH.action IN ('stocked','restocked')
--/*And not exists occurred that is greater for the same rowID*/
AND NOT EXISTS (SELECT 1 FROM AssetManagement_History AS his
WHERE his.rowID = tblAH.rowID
AND his.occurred > tblAH.occurred )
编辑:修改了查询中的错误,这是一个有效的SQL FIDDLE 。
这更像是格式化的评论而不是答案
这个:
INNER JOIN
(SELECT occurred,max(id) id
FROM AssetManagement_History GROUP BY occurred) tblAH ON tblASSET.id = tblAH.rowID
由于tblAH没有名为rowID的字段,因此将引发错误。 这个:
INNER JOIN
(SELECT max(rowID) rowID
FROM AssetManagement_History GROUP BY occurred) tblAH ON tblAH.rowID = tblASSET.id
由于您的愚蠢子查询,可能给出奇怪的结果。 您正在按未选择的字段分组。 单独运行该子查询,看看它是否返回您期望的结果。
我认为这就是您要寻找的。 您需要在子查询中的操作上应用where子句。
SELECT tblASSET.id,tblASSET.serial
FROM AssetManagement tblASSET
INNER JOIN (SELECT occurred,max(id) id
FROM AssetManagement_History
where action in IN ('stocked','restocked') GROUP BY occurred
) tblAH ON tblASSET.id = tblAH.id
WHERE tblASSET.idcode='4'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.