2017-10-07 88 views
0

這是我的sql,但我認爲它太複雜了,也許它不是非常快速和高效?我對嗎?或者,還有更好的方法?有沒有更好的方法來做這個查詢?

SELECT TEventInfoid ,A.TTNum, 
    CASE WHEN TModelid = 3822 THEN (SELECT title 
            FROM dbo.sns_event WHERE id=TEventInfoid 
            ) 
     ELSE (SELECT name 
       FROM dbo.sns_exhibition WHERE id=TEventInfoid 
      ) 
    END, 
    CASE WHEN TModelid = 3822 THEN (SELECT start_time 
            FROM dbo.sns_event WHERE id=TEventInfoid 
            ) 
     ELSE (SELECT start_Time 
       FROM dbo.sns_exhibition WHERE id=TEventInfoid 
      ) 
    END, 
    CASE WHEN TModelid = 3822 THEN (SELECT [address] 
            FROM dbo.sns_event WHERE id=TEventInfoid 
            ) 
     ELSE (SELECT [address] 
       FROM dbo.sns_exhibition WHERE id=TEventInfoid 
      ) 
    END 
    FROM  
     T_Ticktets A 
    WHERE A.TTNum='100229143644' 
+0

好吧,我用MSSQL – jasonLam

回答

1

使用LEFT JOIN

SELECT t.TEventInfoid, t.TTNum, 
     (CASE WHEN t.TModelid = 3822 THEN e.title ELSE ex.name END), 
     (CASE WHEN t.TModelid = 3822 THEN e.start_time ELSE ex.start_time END), 
     (CASE WHEN t.TModelid = 3822 THEN e.address ELSE ex.address END) 
FROM T_Ticktets t LEFT JOIN 
    dbo.sns_event e 
    ON e.id = t.TEventInfoid LEFT JOIN -- unclear which table which is in 
    dbo.sns_exhibition ex 
    ON ex.id = t.TEventInfoid AND 
     e.id IS NULL      -- unclear which table which is in 
WHERE t.TTNum = '100229143644'; 

注:join條件可能有錯誤的表。目前還不清楚哪個列在哪個表中。

另外,如果​​被聲明爲一個大整數或數字,則可以在與之比較的值周圍放置單引號。

此版本確實做出了一個假設。它假定對於給定的id其他表中沒有多行。如果是這樣的話,調整查詢不會太困難。

編輯:

修理好了最後一個問題的辦法很簡單:

SELECT t.TEventInfoid, t.TTNum, 
     COALESCE(e.title, ex.name), 
     COALESCE(e.start_time, ex.start_time), 
     COALESCE(e.address, ex.address) 
FROM T_Ticktets t LEFT JOIN 
    dbo.sns_event e 
    ON e.id = t.TEventInfoid AND t.TModelid = 3822 LEFT JOIN -- unclear which table which is in 
    dbo.sns_exhibition ex 
    ON ex.id = t.TEventInfoid AND t.TModelid <> 3822   -- unclear which table which is in 
WHERE t.TTNum = '100229143644'; 

這可能是用於查詢的最佳形式。注意:如果TModelid可能是NULL,則必須在第二個ON條件中考慮這一點。

+0

的TModelid不會永遠爲NULL。 – jasonLam

+0

@jasonLam。 。 。我不確定你的評論是指什麼。我只是說最後一個查詢中的第二個條件是'ex.id = t.TEventInfoid AND(t.TModelid <> 3822或t.TModelId IS NULL)'。 –

+0

好的,我得到了你。謝謝 – jasonLam

1

您可以使用它。

SELECT 
     TEventInfoid ,A.TTNum, 
     CASE WHEN TModelid = 3822 THEN e.title ELSE x.name END, 
     CASE WHEN TModelid = 3822 THEN e.start_time ELSE x.start_Time END, 
     CASE WHEN TModelid = 3822 THEN e.[address] ELSE x.[address] END 
    FROM  
     T_Ticktets A 
     LEFT JOIN dbo.sns_event e ON e.id=A.TEventInfoid 
     LEFT JOIN dbo.sns_exhibition x WHERE x.id=A.TEventInfoid 
    WHERE A.TTNum='100229143644' 
+0

3Q,我覺得它更舒適 – jasonLam

1

你會如何對自己說這個?我希望所有這裏的門票模型ID是3822,所有展品的事件,它是不是3822

SELECT A.TEventInfoid, 
A.TTNum, 
e.Title, 
e.start_time, 
e.[address], 
A.TModelid 
FROM T_Ticktets A 
JOIN dbo.sns_event e 
ON A.id = e.TEventInfoid 
WHERE A.TTNum='100229143644' 
AND A.TModelid = 3822 

UNION ALL 

SELECT A.TEventInfoid, 
A.TTNum, 
e.Name 
e.start_time, 
e.[address], 
A.TModelid 
FROM T_Ticktets A 
JOIN dbo.sns_exhibition e 
ON e.id = A.TEventInfoid 
WHERE A.TTNum='100229143644' 
AND A.TModelid <> 3822 
+0

是的,它可以工作,但我仍然認爲它太複雜了 – jasonLam

相關問題