2012-02-23 78 views
0

我有一個表信息,其設計是這樣的查詢加入和優化

id - bigint 
Name - varchar2 
refid - bigint 
status - int 
ExpDate - datetime 
  • 狀態值可以是0,1,2,3,4
  • REFID是其他表的外鍵我們將使用過

我想編寫一個查詢所有記錄應來自該表狀態0,1,2,3,但只有7由EXPDATE最新記錄應其來狀態是4.

我想不出在T-SQL中如何實現這一點。

請幫助我或給我建議,以便我可以開始寫它。

高達現在我已經寫

SELECT * 
FROM INFO 
WHERE STATUS IN (0,1,2,3) AND 
     REFID IN (SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW') 

SELECT TOP 7 
FROM INFO 
WHERE STATUS=4 AND 
     REFID IN(SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW') 
ORDER BY EXPDATE DESC 

我需要加入他們的行列???

+0

你想優化查詢或刪除重複記錄

WHERE REFID IN (SELECT REFID FROM #temp1) 

或者:

SELECT REFID INTO #temp1 FROM REFTABLE WHERE REFCHAIN='BMW' 

然後在這樣的兩個查詢使用? – pavanred 2012-02-23 08:38:10

+0

沒有重複記錄,因爲'STATUS'不同。 – coms 2012-02-23 08:40:41

+0

好吧..「正在兩次如何優化它謝謝..」讓我覺得可能有重複的記錄。 – pavanred 2012-02-23 08:43:13

回答

4

只是UNION你的2個電流一起查詢(你需要一個派生表讓高層雖然)

SELECT ... 
FROM INFO 
WHERE STATUS IN (0,1,2,3) AND 
     REFID IN (SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW') 
UNION ALL 
SELECT ... 
FROM 
    (
    SELECT TOP 7 ... 
    FROM INFO 
    WHERE STATUS=4 AND 
      REFID IN(SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW') 
    ORDER BY EXPDATE DESC 
    ) T 

您可以獲得更多信息,但效率可能不高:

SELECT * 
FROM 
    (
    SELECT ..., 
     ROW_NUMBER() OVER (ORDER BY EXPDATE DESC) AS rn 
    FROM INFO 
    WHERE REFID IN (SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW') 
    ) T 
WHERE 
    rn <= 7 OR STATUS <= 4 
+0

子查詢是否有效或加入? – 1Mayur 2012-02-23 09:13:38

+0

子查詢:查看爲什麼http://stackoverflow.com/a/6966259/27535 – gbn 2012-02-23 09:31:36

1

如何..建議,也

(SELECT REFID FROM REFTABLE WHERE REFCHAIN='BMW') 

即將兩次如何優化它感謝查詢..你想優化這個或做你想做的只是刪除重複記錄。

如果你想刪除重複的記錄,那麼你可以嘗試使用聯盟 -

SELECT * FROM INFO 
INNER JOIN REFTABLE ON INFO.refId = REFTABLE.Id 
WHERE REFCHAIN = 'BMW' AND INFO.status IN (0,1,2,3) 
UNION 
SELECT FROM 
    (
     SELECT TOP 7 FROM INFO 
     INNER JOIN REFTABLE ON INFO.refId = REFTABLE.Id 
     WHERE INFO.status=4 AND REFCHAIN='BMW' 
     ORDER BY EXPDATE DESC 
    ) T 
+0

請注意,UNION會增加使用IN(或EXISTS)可以避免的開銷。原因:IN/EXISTS是一個半連接,JOIN是一個等連接。請參閱http://stackoverflow.com/a/6966259/27535 – gbn 2012-02-23 09:06:00

0

針對您的最新7個值reftabl êü可以使用這個query--

select * from REFTABLE where REFID not in( select top (select count(*)-7 from info) REFID from REFTABLE)

它會更好,如果ü可以張貼表結構..

關於聯盟
+0

表結構張貼在q中。清楚地檢查q – 1Mayur 2012-02-23 09:12:22

0

GBN和Pavanred答案解決你的問題「如何加入這個結果。」 如果涉及到優化,您可以爲選擇的結果創建臨時表。然後查詢只執行一次。

但是... 我認爲查詢太微不足道了,以這種方式優化。

反正:像

SELECT ... 
FROM INFO inf 
INNER JOIN #temp1 t ON inf.REFID = t.REFID 
...