2015-10-30 43 views
0

我有一個來自SQL服務器的SQL select語句,它將動態表中的文本放在一起並創建一個union語句。然後,我將此語句複製到Oracle SQL Developer中,以打擊Oracle數據庫以獲取計數或最小/最大列,或其他任何內容。我的查詢與此類似:最後一條記錄,然後從SQL語句中刪除文本並替換爲空白或其他字符

'Select ' + a.column1 + 'from' + a.tablename + 'where ' + a.column1 + '= 123' + 'UNION ALL' 
from Mytable a where a.tablename = 'MYTABLENAMEHERE' 

因此,我然後獲得20個表的列表,然後將其剪切/粘貼到Oracle中以獲得結果。

我的問題是(並且這可能是一個愚蠢的問題,我只是想知道如何在SQL中做到這一點)是最後一個記錄的輸出有'UNION ALL'在它的末尾沒有「; 「 Oracle需要這麼做,所以我總是必須在最後一個記錄中刪除它。

如何告訴SQL什麼時候它是最後一條記錄來替換'UNION ALL'並替換爲「;」終止者聲明,以便在我剪切並粘貼它時,我不必每次都刪除它?

只是從專家好奇!

+1

看看STUFF函數。 –

+0

爲什麼這個問題標籤sql-server,如果你使用的是oracle? – Hogan

回答

1

你可以用一個句子的情況下檢查當前記錄是最後一個,在這種情況下,不是所有的打印UNION:

select 'Select ' + a.column1 + 'from' + a.tablename + 'where ' + a.column1 + '= 123' 
+ case when (select count(*) from Mytable where tablename=a.tablename)=ROW_NUMBER() OVER(order by a.tablename desc) then ';' else ' UNION ALL' end 
from Mytable a where a.tablename = 'MYTABLENAMEHERE' 
+0

嗨JC。感謝那。我想我們很接近。在「從一個選擇計數(*)」之後,我得到一個無效的對象名稱「a」。我嘗試用我的永久表名替換它,並且語法是正確的,但它沒有將最後一個記錄上的最後一個UNION ALL關閉... – Chris

+0

是的,那個「a」應該是您的表名。嘗試更改OVER:OVER的順序(按a.column1排序) –

+0

我只是在SELECT語句中測試了該語句。 「選擇 時(從mytable中選擇count(*))= ROW_NUMBER()OVER(按a.tablename排序),然後';'其他'聯盟所有'結束 from mytable a「 - 這似乎與最後一行放'';最後。在上面的代碼中,我不能在沒有錯誤的情況下在CASE前加一個額外的SELECT。 - 還有「a」的別名在這裏還不起作用。 – Chris

相關問題