2014-07-01 16 views
7

Birlikte birleştirmek istediğim iki sorgu (bazı geçici tablolardan oluşuyor) var. Sendikayla ilgili soruların hangisini (hangisinin önemli olduğunu) açıkladığımda işe yarıyor. Ancak, birliği tanıttığımda, The ntext data type cannot be selected as DISTINCT because it is not comparable. 'u aldım. Neden ana sorguların hiçbirinin farklı kullanılmadığını anlayamıyorum.Birleştirme Nedeniyle ntext veri türü, karşılaştırılabilir olmadığından DISTINCT olarak seçilemiyor

SELECT 
    dbo.CUSTTABLE.ACCOUNTNUM AS 'Account Number', 
    dbo.CUSTTABLE.NAME AS 'Customer Name', 
    [DESCRIPTION] AS 'Division', 
    ISNULL(dbo.USERINFO.NAME, 'OPEN') AS 'Sales Engineer', 
    [STATE], 
    PHONE, 
    PAYMTERMID AS 'Terms', 
    (CASE BLOCKED 
     WHEN 0 THEN 'No' 
     WHEN 2 THEN 'Financial Hold' 
     WHEN 1 THEN 'System Hold' 
     ELSE 'Unknown' END) AS 'Status', 
    [45-60], 
    [61-90], 
    [91-120], 
    [120+], 
    #temptable2.Today, 
    ISNULL(USERMEMO, '') AS 'Notes', 
    ISNULL(#temptable2.Today/NULLIF((ISNULL(#salesTemp.PQ1, 0)/90), 0),0) AS 'DSO1', 
    CustTable.StatisticsGroup as 'Past Due Category' 

FROM 
    dbo.CUSTTABLE INNER JOIN 
    dbo.DIMENSIONS ON DIMENSION2_ = NUM INNER JOIN 
    #temptable2 ON dbo.CUSTTABLE.ACCOUNTNUM = #temptable2.ACCOUNTNUM LEFT OUTER JOIN 
    #temptable ON dbo.CUSTTABLE.ACCOUNTNUM = #temptable.ACCOUNTNUM LEFT OUTER JOIN 
    dbo.SMMSALESUNITMEMBERS ON SALESGROUP = SALESUNITID AND SALESMANAGER = 1 LEFT OUTER JOIN 
    dbo.USERINFO ON ID = SALESMANID AND [ENABLE] = 1  
    JOIN #salesTemp on #salesTemp.ACCOUNTNUM = CUSTTABLE.ACCOUNTNUM 
WHERE 
    DIMENSION2_ IN (@division) 

UNION 
SELECT 
    Customer_ID AS 'Account Number', 
    Customer_Name AS 'Customer Name', 
    'South Bend' AS Division, 
    '' AS 'Sales Engineer', 
    'Indiana' AS 'State', 
    '' AS 'Phone', 
    Customer_Terms AS 'Terms', 
    '' AS 'Status', 
    [45-60], 
    [61-90], 
    [91-120], 
    [120+], 
    [Today], 
    '' AS 'Notes', 
    '' AS 'DSO1', 
    '' AS 'Past Due Category' 
FROM #temptable4 
+3

Bir sendika varsayılan olarak ntext ile desteklenmeyen bir farklı uygular. Sorunun geçip geçmediğini görmek için BÜTÜN TÜMÜNÜ (farklı bir şey yapmaz) deneyin. Eğer öyleyse, o zaman her bir alanın veri türleri herhangi bir ntext 'dir? Eğer öyleyse, değeri nvarchar'a (max) http://social.msdn.microsoft.com/Forums/sqlserver/en-US/c836eda3-f969-4ec2-a231-b2930e288ad5/select-distinct- olarak eklemeniz gerekebilir. ntext alanları veya http://stackoverflow.com/questions/1028061/is-there-any-way-to-distinct-or-group-by-a-text-or-ntext-in-sql-server- 2005 – xQbert

+0

Union all Bana "Veri türü varchar'ı sayısal olarak dönüştürürken hata veriyor." aynı noktada. Datatypes karakter alanları – rigamonk

+0

için char veya varchar şunlardır: # temptable2.Today, # salesTemp.PQ1, enable, salesmanager? Ayrıca '' AS 'DSO1' olabilir, 'SQL server boş dizgeyi ele alıp almadığından emin değilim ve bu nedenle sayısal değere dönüştürebilmek yerine 'NULL AS' DSO1 '' yapması gerekebiliyor ... Infact ... bahse girerim bu son bölümdür. – xQbert

cevap

6

Değişim: İşte ana referans için seçin '' AS 'DSO1', için NULL as 'DS01',

Boş küme SQL server sayısal için dönüştürülemez; Birliğin en üst seçiminde tanımlanan veri türüne göre gereklidir.

Sorun şu ki, birliğin üst seçiminin sayısal bir değer döndürmesi nedeniyle sorun budur. Boş küme bir sayıya dönüştürülemediğinden, bir sayı (0) belirtin veya boş kullanın.

Sendikayı yürütürken, sütun sayısı eşleşmeli ve veri türleri eşleşmelidir. Eğer böyle bir hata yapmazlarsa.

Yoruma ilişkin olarak, "Neden ana sorguların hiçbiri ayrı olarak kullanılmadığından anlamıyorum" A UNION sonuçta ortaya çıkan sonuçlarda ayrı bir yürütme gerçekleştirir. UNION ALL yapmayacak. Bu nedenle, bir UNION'un yürütülmesi dahilinde yinelenen kaldırmayı yapmak zorunda kalmayacak şekilde, bir UNION ALL yürütülmesi daha hızlı gerçekleştirilir.