2013-10-14 54 views
0

例如:有沒有辦法檢查來自JOIN的幾個字段是否相等?

我有查詢:

select coalesce(VV1.[TimeStamp], VV2.[TimeStamp]...) as MyDate, V1, V2, .. VN 
    from VV1 
    full join VV2 
    full join VV3 
    ... 
    full outer join VVN 
    on VV1.TimeStamp = VV2.TimeStamp 
    and VV2.TimeStamp = VV3.TimeStamp 
    ... 
    and VVN-1.TimeStamp = VVN.TimeStamp 

我想生成它作爲字符串,但它的複雜與on一部分......所以

  • 是否有可能把它寫在更好的辦法?
  • 也許不知怎麼寫on AllOfThemAreEqual(VV1.TimeStamp, VV2.TimeStamp .. VVN.TimeStamp)?但我懷疑這是可能的:(
  • 也許這是可以存儲在臨時變量先前的值,然後從那裏提取這最後的選擇看起來最真實的我

SQLFibble:?http://sqlfiddle.com/#!6/4e138/3/0

CREATE TABLE T1(
    [ValueId] [bigint] IDENTITY(1,1) NOT NULL, 
    [PointId] [int] NULL, 
    [Value] [int] NULL, 
    [TimeStamp] [datetime] NULL 
); 

INSERT INTO T1 
      ([PointId] 
      ,[Value] 
      ,[TimeStamp]) 
    VALUES 
      (1, 1, 1900-01-01) 
INSERT INTO T1 
      ([PointId] 
      ,[Value] 
      ,[TimeStamp]) 
    VALUES 
      (2, 2, 1900-01-01) 
; 

WITH VV1 AS (
      SELECT [TimeStamp], [Value] AS V1 FROM T1 
      WHERE [PointId] = 1 
     ), VV2 AS (
      SELECT [TimeStamp], [Value] AS V2 FROM T1 
      WHERE [PointId] = 2 
     ) 
SELECT 
    coalesce(VV1.[TimeStamp], VV2.[TimeStamp]) AS dt 
    , V1, V2 
FROM VV1 
FULL JOIN VV2 
ON VV1.TimeStamp = VV2.TimeStamp 
+1

全外的用例加入很少,而且相距甚遠在大多數現實世界的應用。如果你看到一個警報鈴,你的腦袋就會響起。不要輕易使用它們。 – Tomalak

+0

爲什麼'FULL OUTER'加入而不是'INNER'? – gvee

+0

INNER不返回任何數據......它們不會交叉,但'full join'將返回相同的數據。 – Cynede

回答

3

使用您的小提琴:http://sqlfiddle.com/#!6/4e138/3/0

以下是一種不同的方法。不需要額外的連接,只需給你一行Timestamp

SELECT "Timestamp" 
    , Max(CASE WHEN PointId = 1 THEN "Value" END) As V1 
    , Max(CASE WHEN PointId = 2 THEN "Value" END) As V2 
    , Max(CASE WHEN PointId = 3 THEN "Value" END) As V3 
    , Max(CASE WHEN PointId = 4 THEN "Value" END) As V4 
    , Max(CASE WHEN PointId = 5 THEN "Value" END) As V5 
FROM t1 
GROUP 
    BY "Timestamp" 

請儘量避免動態SQL儘可能

+0

說實話,它仍然是錯誤的,因爲它會導致多個表中的問題:) – Cynede

+0

@ Heather你原來的問題沒有說明這個事實,因此提供的解決方案不適合這個。看起來你正在濫用動態SQL,而這往往是你的設計/解決方案中的一個缺陷。也許你需要回到繪圖板? – gvee

+0

我已經設法完成:)以完全加入的複雜方式,但它的工作原理與我想要的一樣。 – Cynede

相關問題