簡體   English   中英

如何在子查詢中繞過對外部表的引用?

[英]How to bypass a reference to an outer table in subquery?

我一直在處理以下兩個表:

文獻

id    company_id    etc
=======================
1     2             x
2     2             x

id    document_id   version    date_created    date_issued   date_accepted
==========================================================================
1     1             1          2013-04-29      2013-04-30    NULL
2     2             1          2013-05-01      NULL          NULL
3     1             2          2013-05-01      2013-05-01    2013-05-03

我要在一個頁面上列出所有文檔及其屬性。 我想在每個文檔中添加一個具有狀態的文檔。 該狀態可以從相應Version的最新日期得出。 可能會接受較舊的版本。

我正在尋找的查詢結果是這樣的:

id    company_id    etc   status
==================================
1     2             x     accepted
2     2             x     created

我首先進行查詢,該查詢結合了所有日期並在其旁邊添加一個狀態。 它按預期工作,當我添加document_id時,一切看起來都很好。

SELECT `status`
FROM (
    SELECT max(date_created) as `date`,'created' as `status` FROM version WHERE document_id = 1
    UNION
    SELECT max(date_issued),'issued' FROM version WHERE document_id = 1
    UNION
    SELECT max(date_accepted),'accepted' FROM version WHERE document_id = 1
    ORDER BY date DESC
    LIMIT 1
) as maxi

當我嘗試將此查詢合並為子查詢時,我無法使其正常工作。

SELECT *, (
  SELECT `status` FROM (
    SELECT max(date_created) as `date`,'created' as `status`FROM version WHERE document_id = document.id
    UNION
    SELECT max(date_issued),'issued' FROM version WHERE document_id = document.id
    UNION
    SELECT max(date_accepted),'accepted' FROM version WHERE document_id = document.id
    ORDER BY date DESC
    LIMIT 1
  ) as maxi
) as `status`
FROM `document`

這將使我Unknown column 'document.id' in 'where clause'出現Unknown column 'document.id' in 'where clause'錯誤。 因此,我在SO處offer.id閱讀了一下,發現它根本無法達到offer.id的值,因為它是子查詢中的子查詢。 因此,我嘗試采用另一種方法並立即獲取所有狀態,以避免使用WHERE語句,並加入它們。 我結束了下一個查詢。

SELECT MAX(`date`),`status`, document_id
FROM (
    SELECT datetime_created as `date`, 'created' as `status`,document_id FROM `version`
    UNION
    SELECT datetime_issued, 'issued',document_id FROM `version`
    UNION
    SELECT datetime_accepted, 'accepted',document_id FROM `version`
) as dates
GROUP BY offer_id

這次沒有錯誤,但是我意識到status不可能是正確的,因為它在GROUP BY期間丟失了。 我已經嘗試過將兩者結合使用,但是兩個缺陷都一直困擾着我。 有人可以建議在不更改我的數據庫的情況下如何在單個查詢中執行此操作嗎? (我知道將日期保存在單獨的表中會很簡單)

我尚未對此進行測試,但是您可以這樣做(您可能需要調整細節)

基本上是從完全不同的角度來看它。

 select
    d.*,
    (CASE GREATEST(ifnull(v.date_created, 0), ifnull(v.date_issued,0), ifnull(v.date_accepted,0) ) 
      WHEN null THEN 'unknown'
      WHEN v.date_accepted THEN 'accepted'
      WHEN v.date_issued THEN 'issued'
      WHEN v.date_created THEN 'created'
      END) as status 
from document d
left join version v on 
    v.document_id = d.document_id and 
    not exists (select 1 from (select * from version) x where x.document_id = v.document_id and x.id <> v.id and x.version > v.version)
select Doc.document_id,Doc.company_id,Doc.etc,f.status
from Document Doc
inner join 
    (select Ver.document_id,
    case when Ver.date_accepted is not null then 'Accepted'
    when Ver.date_issued is not null then 'Issued'
    when Ver.date_created is not null then 'Created'
    end as status
from version Ver
inner join (
                select document_id,MAX(version) VersionId
                from version
                group by document_id
            )t on t.document_id=Ver.document_id 
where t.VersionId=Ver.version
)f on Doc.document_id=f.document_id

SQL小提琴

您可以規范化表格設計以將狀態/日期移動到與版本不同的表格上嗎?

如果不可能這樣:

SELECT Document.id, Document.company_id, Document.etc, CASE WHEN Sub1.status = 3 THEN 'accepted' WHEN Sub1.status = 2 THEN 'issued' WHEN Sub1.status = 1 THEN 'created' ELSE NULL END AS status
FROM Document
INNER JOIN (
    SELECT document_id, MAX(CASE WHEN date_accepted IS NOT NULL THEN 3 WHEN date_issued IS NOT NULL THEN 2 WHEN date_created IS NOT NULL THEN 1 ELSE NULL END) AS status 
    FROM Version
    GROUP BY document_id
) Sub1
ON Document.id = Sub1.document_id

子選擇從版本表中獲得任何文檔的最高狀態。 每個可能的版本最高狀態均以數字形式返回,並且通過將其分組到文檔ID上,它將獲得任何版本的最高狀態。 將其與Document表結合在一起,並將版本號的編號轉換為文本描述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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