2011-09-02 60 views
5

我需要一個查詢,這些三個不同的數據庫服務器上沒有任何更改:MySQL,MSSQL,PostgreSQL。 在這個查詢我必須以計算下面的表達式上的MySQL正常工作的列:指望DISTINCT的幾個字段只能在MySQL上工作嗎?

field_char = character 
field_int = integer 
field_date = datetime 

表達是內部的:

COUNT(DISTINCT field_char,field_int,field_date) AS costumernum 

中相應的不同是不同的類型的字段父查詢選擇,所以如果我試圖實現與子查詢方法的結果,我在這種情況下跌倒:

SELECT t0.description,t0.depnum 
(select count(*) from (
    select distinct f1, f2, f3 from salestable t1 
    where t1.depnum = t0.depnum 
) a) AS numitems 
FROM salestable t0 

我得到一個錯誤與此QUER Ÿ,我如何獲得父查詢的值?

表達式在MySQL上正常工作,但當我嘗試在Sql Server或PostgreSQL上執行它時出現錯誤(問題在於count函數不接受MSSQL/PostgreSQL上不同類型的3個參數),是有一種方法可以在每個數據庫服務器(SQL Server,MySQL,PostgreSQL)中使用一個表達式來實現相同的結果嗎?

回答

7

一般的方式來做到這一點在任何平臺上如下:

select count(*) from (
    select distinct f1, f2, f3 from table 
) a 

編輯新信息:

如果你試圖連接到不同的列表(包括部門)和然後做點數?我創建了一些測試數據,這似乎工作。確保COUNT位於t1列之一上 - 否則當t1中沒有對應的條目時,它將錯誤地返回1而不是0。

SELECT t0.description, t0.depnum, count(t1.depnum) as 'numitems' 
FROM salestable t0 
LEFT JOIN (select distinct f1,f2,f3,depnum from salestable) t1 
    ON t0.depnum = t1.depnum 
GROUP BY 
    t0.description, t0.depnum 
+0

我已經嘗試過使用這種方法,唯一的問題是我必須使用必須從父查詢中獲取的值來過濾子查詢,請參閱以下文章:http://stackoverflow.com/questions/ 7088107 /如何獲取嵌套子查詢識別父母查詢列 – aleroot

+0

我看到,編輯帖子以解決其他需求。 –

+0

看起來它可行,但在MySQL上非常慢,我不知道爲什麼,在其他數據庫服務器上工作得相當快......你知道一個解決方案嗎? – aleroot

0

如何連接?

COUNT(DISTINCT field_char || '.' || 
       cast(field_int as varchar) || '.' || 
       cast(field_date as varchar)) AS costumernum 

警告:您的連接符可以與RDBMS的味道有所不同。

更新

顯然,連接操作的便攜性問題本身:

我想幫助你的distinct問題。

+0

爲什麼不只是使用concat?我不覺得有信心使用數學運算符 – ajreal

+0

演員工作正常,但我不能對每個數據庫使用相同的查詢:Mysql,PostgreSQL,MSSQL,因爲這些數據庫服務器之間字符串連接的語法不同... – aleroot

相關問題