簡體   English   中英

INNER JOIN未返回結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM