sql用法 - sql連接




如何將SQL子查詢轉換為聯接 (5)

也許這樣?

SELECT
  t2.id,
  t2.title,
  t2.contenttext,
  t2.fk_idothertable,
  t2.version
FROM mytable t1, mytable t2
WHERE t1.fk_idothertable == t2.fk_idothertable
GROUP BY t2.fk_idothertable, t2.version
HAVING t2.version=MAX(t1.version)

只是一個瘋狂的猜測...

我有兩個1:n關係的表:“content”和“versioned-content-data”(例如,一個文章實體和該文章創建的所有版本)。 我想創建一個顯示每個“內容”的頂級版本的視圖。

目前我使用這個查詢(用一個簡單的子查詢):

SELECT 
   t1.id, 
   t1.title, 
   t1.contenttext,
   t1.fk_idothertable
   t1.version
FROM mytable as t1
WHERE (version = (SELECT MAX(version) AS topversion
                  FROM mytable
                  WHERE (fk_idothertable = t1.fk_idothertable)))

子查詢實際上是對提取特定項目的最高版本的同一個表的查詢。 請注意,版本化的項目將具有相同的fk_idothertable。

在SQL Server中,我試圖創建這個查詢的索引視圖 ,但似乎我不能夠,因為索引視圖中不允許子查詢。 所以...這是我的問題...你能想出一種方法來將此查詢轉換為JOINs的某種查詢?

似乎索引視圖不能包含:

  • 子查詢
  • 公用表表達式
  • 派生表
  • 有條款

我很絕望。 任何其他的想法,歡迎:-)

非常感謝!


像這樣......我假設子查詢中的“mytable”是一個不同的實際表格...所以我把它稱為mytable2。 如果是同一張桌子,那麼這個功能仍然可以工作,但是我認為fk_idothertable只是'id'。


SELECT 
   t1.id, 
   t1.title, 
   t1.contenttext,
   t1.fk_idothertable
   t1.version
FROM mytable as t1
    INNER JOIN (SELECT MAX(Version) AS topversion,fk_idothertable FROM mytable2 GROUP BY fk_idothertable) t2
        ON t1.id = t2.fk_idothertable AND t1.version = t2.topversion

希望這可以幫助


我認為FerranB很接近,但是沒有完全的分組權利:

with
latest_versions as (
   select 
      max(version) as latest_version,
      fk_idothertable
   from 
      mytable
   group by 
      fk_idothertable
)
select
  t1.id, 
  t1.title, 
  t1.contenttext,
  t1.fk_idothertable,
  t1.version
from 
   mytable as t1
   join latest_versions on (t1.version = latest_versions.latest_version 
      and t1.fk_idothertable = latest_versions.fk_idothertable);

中號


If SQL Server accepts LIMIT clause, I think the following should work:
SELECT 
   t1.id, 
   t1.title, 
   t1.contenttext,
   t1.fk_idothertable
   t1.version
FROM mytable as t1 ordery by t1.version DESC LIMIT 1;
(DESC - For descending sort; LIMIT 1 chooses only the first row and
DBMS usually does good optimization on seeing LIMIT).

我不知道這將是多高效,但是:

SELECT t1.*, t2.version
FROM mytable AS t1
    JOIN (
        SElECT mytable.fk_idothertable, MAX(mytable.version) AS version
        FROM mytable
    ) t2 ON t1.fk_idothertable = t2.fk_idothertable




subquery