Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Uyumsuz SQL İfadelerinin Yeniden Yazılması

Son Güncelleme:Oct 04, 2026

Bu konu, uyumsuz SQL ifadelerinin nasıl değiştirileceğini açıklar.

Arka plan bilgileri

MaxCompute V2.0, açık kaynak ekosistemini tam olarak benimser. Daha fazla dil özelliğini destekler ve daha hızlı çalışır. Ancak MaxCompute V2.0 daha sıkı sözdizimi denetimleri uygular. Önceki derleyici sürümlerinde başarıyla çalışan, sözdizimi belirsiz olan sorgular MaxCompute V2.0'da hatalara neden olabilir.

group.by.with.star

Açıklama: Bu sorun, bir select * …group by… ifadesi kullandığınızda ortaya çıkar.

  • MaxCompute V2.0'da GROUP BY listesi kaynak tablodaki tüm sütunları içermelidir. Aksi takdirde hata oluşur.

  • MaxCompute'in önceki sürümleri, GROUP BY listesi kaynak tablodaki tüm sütunları içermese bile select * from ... group by key sözdizimini destekler.

Örnekler

  • Senaryo 1: GROUP BY anahtarı, kaynak tablodaki tüm sütunları içermiyor.

    • Hatalı sözdizimi

      select * from t group by key;
    • Hata iletisi

      FAILED: ODPS-0130071:[1,8] Semantic analysis exception - column reference t.value should appear in GROUP BY key
    • Doğru sözdizimi

      select distinct key from t;
  • Senaryo 2: GROUP BY anahtarı tüm sütunları içeriyor.

    • Aşağıdaki sözdizimi önerilmez.

      select * from t group by key, value; -- t has columns key and value
    • Bu sözdizimi MaxCompute V2.0'da hataya neden olmasa da ifadeyi aşağıdaki gibi değiştirmenizi öneririz.

      select distinct key, value from t;

bad.escape

Açıklama: Bu sorun, yanlış kaçış dizileriyle ilgilidir.

MaxCompute kurallarına göre dize değişmezinizde 0 ile 127 arasındaki ASCII karakterlerini temsil etmek için bir ters eğik çizgi ve ardından üç basamaklı sekizlik sayı kullanmanız gerekir. Örneğin, 0 ve 1'i temsil etmek için "\001" ve "\002" kullanabilirsiniz. Ancak önceki sürümler \01 ve \0001 değerlerini de \001 olarak işliyordu.

Bu davranış kafa karıştırıcı olabilir. Örneğin, "\0001" ifadesini "\000" sonrasına gelen "1" olarak temsil etmek için kullanamazsınız. Diğer sistemlerden geçiş yapan kullanıcılar için bu davranış doğruluk hatalarına da neden olabilir.

Not

\000 değerine bir sayı eklemek (örneğin \0001 - \0009 veya \00001) hataya neden olabilir.

MaxCompute V2.0 bu sorunu çözer. Komut dosyalarınızdaki yanlış dizileri değiştirmeniz gerekir.

  • Hatalı sözdizimi

    select split(key, "\01"), value like "\0001" from t;
  • Hata iletisi

    FAILED: ODPS-0130161:[1,19] Parse exception - unexpected escape sequence: 01
    ODPS-0130161:[1,38] Parse exception - unexpected escape sequence: 0001
  • Doğru sözdizimi

    select split(key, "\001"), value like "\001" from t;

column.repeated.in.creation

Açıklama: MaxCompute V2.0'da bir tablo oluştururken yinelenen sütun adları kullanılırsa hata oluşur.

Örnek

  • Hatalı sözdizimi

    create table t (a BIGINT, b BIGINT, a BIGINT);
  • Hata iletisi

    FAILED: ODPS-0130071:[1,37] Semantic analysis exception - column repeated in creation: a
  • Doğru sözdizimi

    create table t (a BIGINT, b BIGINT);

string.join.double

Açıklama: Bu sorun, eşittir işaretinin sol tarafının STRING türünde, sağ tarafının ise DOUBLE türünde olduğu bir JOIN koşulunda ortaya çıkar.

  • MaxCompute'in önceki sürümleri her iki tarafı da BIGINT türüne dönüştürür. Bu dönüşüm önemli bir hassasiyet kaybına neden olabilir. Örneğin, 1.1="1" join koşulu doğru kabul edilir.

  • Hive ile uyumluluk sağlamak amacıyla MaxCompute V2.0 her iki tarafı da DOUBLE türüne dönüştürür.

Örnek

  • Önerilmez

    select * from t1 join t2 on t1.double_value = t2.string_value;
  • Uyarı iletisi

    WARNING:[1,48]  implicit conversion from STRING to DOUBLE, potential data loss, use CAST function to suppress
  • Önerilen sözdizimi

    select * from t1 join t2 on t.double_value = cast(t2.string_value as double);

window.ref.prev.window.alias

Açıklama: Bu sorun, bir pencere işlevinin aynı SELECT listesindeki başka bir pencere işlevinin takma adına başvurması durumunda ortaya çıkar.

Örnek

  • t1 içinde rn yoksa aşağıdaki sözdizimi yanlıştır.

    select row_number() over (partition by c1 order by c1) rn,
    row_number() over (partition by c1 order by rn) rn2
    from t1;
  • Hata iletisi

    FAILED: ODPS-0130071:[2,45] Semantic analysis exception - column rn cannot be resolved
  • Doğru sözdizimi

    select row_number() over (partition by c1 order by rn) rn2
    from
    (select c1, row_number() over (partition by c1 order by c1) rn
    from t1
    ) tmp;

select.invalid.token.after.star

Açıklama: Bir SELECT listesinde bir tablodaki tüm sütunları seçmek için yıldız işareti () kullanabilirsiniz. Ancak yıldız işaretinden () sonra bir alias ekleyemezsiniz. Yıldız işareti (*) yalnızca tek bir sütuna genişlese bile bu sözdizimine izin verilmez. MaxCompute V2.0 derleyicisi bu sözdizimi için hata bildirir.

Örnek

  • Hatalı sözdizimi

    select * as alias from table_test;
  • Hata iletisi

    FAILED: ODPS-0130161:[1,10] Parse exception - invalid token 'as'
  • Doğru sözdizimi

    select * from table_test;

agg.having.ref.prev.agg.alias

Açıklama: Bu sorun, SELECT listesinin önceki bir toplama işlevinin takma adına başvurması ve bir HAVING yan tümcesinin mevcut olması durumunda ortaya çıkar.

Örnek

  • Hatalı sözdizimi

    select count(c1) cnt,
    sum(c1) / cnt avg
    from t1
    group by c2
    having cnt > 1;
  • Hata iletisi

    FAILED: ODPS-0130071:[2,11] Semantic analysis exception - column cnt cannot be resolved
    ODPS-0130071:[2,11] Semantic analysis exception - column reference cnt should appear in GROUP BY key

    Bu örnekte s ve cnt kaynak tablo t1 içinde mevcut değildir. MaxCompute'in önceki sürümleri HAVING yan tümcesi nedeniyle hata bildirmiyordu. MaxCompute V2.0 ise bir column cannot be resolved hatası bildirir.

  • Doğru sözdizimi

    select cnt, s, s/cnt avg
    from
    (
    select count(c1) cnt,
    sum(c1) s
    from t1
    group by c2
    having count(c1) > 1
    ) tmp;

order.by.no.limit

Açıklama: MaxCompute varsayılan olarak döndürülen sonuç sayısını sınırlamak için bir limit yan tümcesini bir order by yan tümcesinden sonra eklemenizi gerektirir. order by işlemi tam sıralama gerçekleştirdiğinden ve bir limit yan tümcesi kullanılmadığında yürütme performansı düşük olduğundan bu gereklilik vardır.

Örnek

  • Hatalı sözdizimi

    select * from (select *
    from (select cast(login_user_cnt as int) as uv, '3' as shuzi
    from test_login_cnt where type = 'device' and type_name = 'mobile') v
    order by v.uv desc) v
    order by v.shuzi limit 20;
  • Hata iletisi

    FAILED: ODPS-0130071:[4,1] Semantic analysis exception - ORDER BY must be used with a LIMIT clause

order by v.uv desc alt sorgusuna bir limit yan tümcesi ekleyin.

Ek olarak MaxCompute V1.0 görünümleri denetlerken katı değildir. Örneğin, limit denetiminin gerekli olmadığı bir projede odps.sql.validate.orderby.limit=false ayarını yaparak bir görünüm oluşturabilirsiniz.

create view table_view as select id from table_view order by id;

Bu görünüme erişmek için:

select * from table_view;

MaxCompute V1.0 hata bildirmez. MaxCompute V2.0 ise aşağıdaki hata iletisini bildirir:

FAILED: ODPS-0130071:[1,15] Semantic analysis exception - while resolving view xdj.xdj_view_limit - ORDER BY must be used with a LIMIT clause

generated.column.name.multi.window

Açıklama: Bu sorun, otomatik olarak oluşturulan aliases kullanımını içerir.

MaxCompute'in önceki sürümleri bir SELECT ifadesindeki her ifade için otomatik olarak bir takma ad oluşturur. Bu takma ad konsolda görüntülenir. Ancak bu takma adı oluşturma kuralları garanti edilmez ve değişebilir. Bu nedenle otomatik olarak oluşturulan takma adları kullanmamalısınız.

MaxCompute V2.0 otomatik olarak oluşturulan takma adlar kullanıldığında uyarı verir. Bu uygulama yaygın olarak kullanıldığından şu an için engellenemez.

Bazı durumlarda MaxCompute sürümleri arasında takma ad oluşturma kuralları değişir. Bazı çevrimiçi işler bu takma adlara dayandığından bu sorgular MaxCompute sürüm yükseltmesi veya geri alma sırasında başarısız olabilir. Bu sorunla karşılaşırsanız kullanmak istediğiniz sütunlar için takma adları açıkça belirtmek üzere sorgularınızı değiştirmeniz gerekir.

Örnek

  • Önerilmez

    select _c0 from (select count(*) from table_name) t;
  • Önerilen sözdizimi:

    select c from (select count(*) c from table_name) t;

non.boolean.filter

BOOLEAN olmayan bir filtre koşulu kullanımıyla ilgili sorun.

MaxCompute Boolean türleri ile diğer veri türleri arasında örtük dönüştürmelere izin vermez. Ancak MaxCompute'in önceki sürümleri bazı durumlarda BIGINT türünü filtre koşulu olarak kullanmanıza olanak tanır. MaxCompute V2.0 artık bu davranışa izin vermez. Komut dosyalarınız bu tür filtre koşulları içeriyorsa bunları değiştirmeniz gerekir. Aşağıda bir örnek verilmiştir:

Hatalı sözdizimi:

select id, count(*) from table_name group by id having id;

Hata iletisi:

FAILED: ODPS-0130071:[1,50] Semantic analysis exception - expect a BOOLEAN expression

Doğru yöntem aşağıdaki gibidir:

select id, count(*) from table_name group by id having id <> 0;

post.select.ambiguous

order by, cluster by, distribute by veya sort by ifadelerinde çakışan ada sahip sütunların referans alınmasıyla ilgili sorun.

MaxCompute'in önceki sürümlerinde sistem varsayılan olarak işlem nesnesi olarak SELECT listesindeki son sütunu seçer. MaxCompute V2.0 hata bildirir. İfadelerinizi değiştirmeniz gerekir. Aşağıda bir örnek verilmiştir:

Hatalı sözdizimi:

select a, b as a from t order by a limit 10;

Hata iletisi:

FAILED: ODPS-0130071:[1,34] Semantic analysis exception - a is ambiguous, can be both t.a or null.a

Aşağıda doğru düzeltme gösterilmektedir:

select a as c, b as a from t order by a limit 10;

Bu değişiklik adların çakıştığı ancak anlamların aynı olduğu durumları da kapsar. Bu durum belirsizliğe neden olmasa da bu sözdizimi kolayca hatalara yol açabileceğinden düzeltmeler yapmanız için bir uyarı bildirilir.

duplicated.partition.column

Bir sorguda aynı ada sahip bölümlerin belirtilmesiyle ilgili sorun.

MaxCompute'in önceki sürümleri aynı ada sahip bir bölüm anahtarı belirttiğinizde hata bildirmezdi. Bunun yerine sonraki anahtarın değeri önceki anahtarın değerinin üzerine yazılırdı. Bu davranış kolayca kafa karışıklığına neden olabilirdi. MaxCompute V2.0 bu durum için hata bildirir. Aşağıdaki örnekler sorunu göstermektedir:

Hatalı sözdizimi 1:

insert overwrite table partition (ds = '1', ds = '2')select ... ;

Çalışma zamanında ds = ‘1’ yoksayılır.

Doğru yöntem aşağıdaki gibidir:

insert overwrite table partition (ds = '2')select ... ;

Hatalı sözdizimi 2:

create table t (a bigint, ds string) partitioned by (ds string);

Doğru yordam:

create table t (a bigint) partitioned by (ds string);

order.by.col.ambiguous

select listesinde yinelenen bir takma ad bulunması ve bunun daha sonra bir order by yan tümcesi tarafından referans alınmasıyla ilgili sorun.

Hatalı sözdizimi:

select id, id
from table_test 
order by id;

Doğru yöntem aşağıdaki gibidir:

select id, id id2
from table_name 
order by id;

order by yan tümcesinde referans almadan önce yinelenen takma adı kaldırın.

in.subquery.without.result

colx in subquery ifadesi sonuç döndürmediğinde colx öğesinin kaynak tabloda mevcut olmadığı bildirilmesiyle ilgili sorun.

Hatalı sözdizimi:

select * from table_name
where not_exist_col in (select id from table_name limit 0);

Hata iletisi:

FAILED: ODPS-0130071:[2,7] Semantic analysis exception - column not_exist_col cannot be resolved

ctas.if.not.exists

Hedef tablo için hatalı sözdizimiyle ilgili sorun.

Hedef tablo zaten varsa MaxCompute'in önceki sürümleri sözdizimi denetimi gerçekleştirmez. MaxCompute V2.0 normal sözdizimi denetimi gerçekleştirir. Bu değişiklik birçok hata iletisine neden olabilir. Aşağıda bir örnek verilmiştir:

Hatalı sözdizimi:

create table if not exists table_name
as
select * from not_exist_table;

Hata iletisi:

FAILED: ODPS-0130131:[1,50] Table not found - table meta_dev.not_exist_table cannot be resolved

worker.restart.instance.timeout

MaxCompute'in önceki sürümlerinde Kullanıcı Tanımlı İşlev (UDF) tarafından çıktılanan her kayıt dağıtılmış dosya sistemine bir yazma işlemi tetikler ve Fuxi'ye bir kalp atışı gönderir. UDF 10 dakika boyunca herhangi bir sonuç çıkarmazsa aşağıdaki hata iletisini alırsınız:

FAILED: ODPS-0123144: Fuxi job failed - WorkerRestart errCode:252,errMsg:kInstanceMonitorTimeout, usually caused by bad udf performance.

MaxCompute V2.0'nın çalışma zamanı çerçevesi vektörleştirmeyi destekler. Vektörleştirme yürütme verimliliğini artırmak için bir sütunun birden çok satırını aynı anda işler. Ancak vektörleştirme daha önce hatasız çalışan ifadelerin zaman aşımına uğramasına neden olabilir. İki kaydın çıktısı arasındaki aralık 10 dakikadan azsa bu sorun ortaya çıkabilir. Birden çok satır aynı anda işlendiğinden kalp atışları Fuxi'ye zamanında gönderilmeyebilir.

Bu hatayla karşılaşırsanız öncelikle UDF'nizin performans sorunları olup olmadığını kontrol edin (örneğin her kaydın işlenmesinin birkaç saniye sürmesi). UDF performansını optimize edemiyorsanız toplu iş satırı boyutunu manuel olarak ayarlayarak sorunu çözmeyi deneyebilirsiniz. Varsayılan değer 1024'tür.

set odps.sql.executionengine.batch.rowcount=16;

divide.nan.or.overflow

MaxCompute'in önceki sürümlerinin bölme işlemi için sabit katlama gerçekleştirmemesiyle ilgili sorun.

Örneğin aşağıdaki ifade için MaxCompute'in önceki sürümlerindeki fiziksel yürütme planı şu şekildedir:

explain
select if(false, 0/0, 1.0)
from table_name;
in task M1_Stg1:
    Data source: meta_dev.table_name
    TS: alias: table_name
      SEL: If(False, Divide(UDFToDouble(0), UDFToDouble(0)), 1.0)
        FS: output: None

Gördüğünüz gibi IF ve Divide işlevleri korunur. Çalışma zamanında IF işlevinin ilk parametresi false olduğundan ikinci parametredeki Divide ifadesi değerlendirilmez. Bu nedenle sıfıra bölme istisnası oluşmaz.

Ancak MaxCompute V2.0 bölme işlemi için sabit katlamayı destekler ve aşağıdaki örnekte gösterildiği gibi hata bildirir:

Hatalı sözdizimi:

select IF(FALSE, 0/0, 1.0)
from table_name;

Hata iletisi:

FAILED: ODPS-0130071:[1,19] Semantic analysis exception - encounter runtime exception while evaluating function /, detailed message: DIVIDE func result NaN, two params are 0.000000 and 0.000000

Yukarıdaki hataya ek olarak taşma hatasıyla da karşılaşabilirsiniz. Örneğin:

Hatalı sözdizimi:

select if(false, 1/0, 1.0)
from table_name;

Hata iletisi:

FAILED: ODPS-0130071:[1,19] Semantic analysis exception - encounter runtime exception while evaluating function /, detailed message: DIVIDE func result overflow, two params are 1.000000 and 0.000000

Doğru yöntem aşağıdaki gibidir:

/0 kullanımını kaldırın ve geçerli bir sabitle değiştirin.

CASE WHEN sabit katlamada benzer bir sorun vardır. Örneğin CASE WHEN TRUE THEN 0 ELSE 0/0 ifadesinde MaxCompute V2.0 sabit katlama sırasında tüm alt ifadeleri değerlendirir. Bu durum sıfıra bölme hatasına neden olur.

CASE WHEN daha karmaşık optimizasyon senaryolarını içerebilir. Örneğin:

select case when key = 0 then 0 else 1/key end
from (
select 0 as key from src
union all
select key from src) r;

Optimizasyon aracı bölme işlemini alt sorguya iter. Dönüşüm aşağıdakine benzer:

M (
select case when 0 = 0 then 0 else 1/0 end c1 from src
UNION ALL
select case when key = 0 then 0 else 1/key end c1 from src) r;

Hata iletisi:

FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.ArithmeticException: DIVIDE func result overflow, two params are 1.000000 and 0.000000

Bu durumda UNION ALL öğesinin ilk yan tümcesi için sabit katlama hata bildirir. Bu sorunu çözmek için SQL ifadesindeki CASE WHEN yan tümcesini alt sorguya taşıyın, gereksiz CASE WHEN yan tümcesini kaldırın ve /0 kullanımını kaldırın:

select c1 end
from (
select 0 c1 end from src
union all
select case when key = 0 then 0 else 1/key end) r;

small.table.exceeds.mem.limit

MaxCompute'in önceki sürümleri Çok Yönlü Join (Multi-way Join) optimizasyonunu destekler. Aynı join anahtarını kullanan birden çok join tek bir Fuxi görevinde birleştirilir. Aşağıdaki sorgudaki J4_1_2_3_Stg1 buna bir örnektir:

explain
select t1.*
from t1 join t2 on t1.c1 = t2.c1
join t3 on t1.c1 = t3.c1;

MaxCompute'in önceki sürümlerindeki fiziksel yürütme planı:

In Job job0:
root Tasks: M1_Stg1, M2_Stg1, M3_Stg1
J4_1_2_3_Stg1 depends on: M1_Stg1, M2_Stg1, M3_Stg1

In Task M1_Stg1:
    Data source: meta_dev.t1

In Task M2_Stg1:
    Data source: meta_dev.t2

In Task M3_Stg1:
    Data source: meta_dev.t3

In Task J4_1_2_3_Stg1:
    JOIN: t1 INNER JOIN unknown INNER JOIN unknown
        SEL: t1._col0, t1._col1, t1._col2
            FS: output: None

Bir MapJoin ipucu eklerseniz MaxCompute'in önceki sürümlerindeki fiziksel yürütme planı değişmez. Bu durum MaxCompute'in önceki sürümlerinin Çok Yönlü Join optimizasyonuna öncelik verdiğini ve kullanıcı tarafından belirtilen MapJoin ipuçlarını yoksayabileceğini gösterir.

explain
select /* +mapjoin(t1) */ t1.*
from t1 join t2 on t1.c1 = t2.c1
join t3 on t1.c1 = t3.c1;

MaxCompute'in önceki sürümlerindeki fiziksel yürütme planı yukarıdaki planla aynıdır.

MaxCompute V2.0 optimizasyon aracı kullanıcı tarafından belirtilen MapJoin ipuçlarına öncelik verir. Yukarıdaki örnekte t1 büyükse aşağıdakine benzer bir hatayla karşılaşabilirsiniz:

FAILED: ODPS-0010000:System internal error - SQL Runtime Internal Error: Hash Join Cursor HashJoin_REL… small table exceeds, memory limit(MB) 640, fixed memory used …, variable memory used …

Bu durumda MapJoin davranışı beklediğiniz gibi değilse MapJoin ipucunu kaldırabilirsiniz.

sigkill.oom

small.table.exceeds.mem.limit sorununa benzer şekilde bir MapJoin ipucu belirtirseniz ve belirtilen küçük tablo büyükse Çok Yönlü Join olarak optimize edildiğinden sorgu MaxCompute'in önceki sürümlerinde başarılı olabilir. MaxCompute V2.0'da küçük tablonun bellek sınırını aşmasından kaynaklanan hatalardan kaçınmak için odps.sql.mapjoin.memory.max ayarını yapabilirsiniz. Ancak her MaxCompute çalışanının sabit bir bellek sınırı vardır. Küçük tablo çok büyükse MaxCompute çalışanı bellek yetersizliği (OOM) hatası nedeniyle sonlandırılır. Hata aşağıdakine benzer:

Fuxi job failed - WorkerRestart errCode:9,errMsg:SigKill(OOM), usually caused by OOM(outof memory).

Bu durumda MapJoin ipucunu kaldırabilir ve Çok Yönlü Join kullanabilirsiniz.

wm_concat.first.argument.const

Toplama işlevleri bölümündeki WM_CONCAT açıklaması WM_CONCAT öğesinin ilk parametresinin her zaman bir sabit olması gerektiğini belirtir. MaxCompute'in önceki sürümleri bu denetim konusunda katı değildir. Örneğin kaynak tabloda veri yoksa WM_CONCAT öğesinin ilk parametresi bir ColumnReference olsa bile hata bildirilmez.

Function declaration:
string wm_concat(string separator, string str)
Parameter description:
separator: A constant of the String type. This is the separator. Other data types or non-constants will cause an exception.

MaxCompute V2.0 planlama aşamasında parametrelerin geçerliliğini denetler. WM_CONCAT öğesinin ilk parametresi bir sabit değilse hemen hata bildirilir. Aşağıda bir örnek verilmiştir:

Hatalı sözdizimi:

select wm_concat(value, ',') FROM src group by value;

Hata iletisi:

FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: com.aliyun.odps.lot.cbo.validator.AggregateCallValidator$AggregateCallValidationException: Invalid argument type - The first argument of WM_CONCAT must be constant string.

pt.implicit.convertion.failed

srcpt, iki bölümü olan bölümlenmiş bir tablodur:

create table srcpt(key STRING, value STRING) partitioned by (pt STRING);
alter table srcpt add partition (pt='pt1');
alter table srcpt add partition (pt='pt2');

Yukarıdaki SQL ifadesi için String türündeki pt sütunu ve INT türündeki sabitler karşılaştırma amacıyla her ikisi de DOUBLE türüne dönüştürülür. Proje odps.sql.udf.strict.mode=true olarak ayarlansa bile MaxCompute'in önceki sürümleri hata bildirmez. Tüm pt değerleri filtrelenir. MaxCompute V2.0 hata bildirir. Aşağıda bir örnek verilmiştir:

Hatalı sözdizimi:

select key from srcpt where pt in (1, 2);

Hata iletisi:

FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.NumberFormatException: ODPS-0123091:Illegal type cast - In function cast, value 'pt1' cannot be casted from String to Double.

Bir STRING bölüm anahtarı sütununu INT türündeki sabitlerle karşılaştırmaktan kaçının. INT türündeki sabitleri STRING türüne değiştirmeniz gerekir.

having.use.select.alias

SQL spesifikasyonu GROUP BY ve HAVING yan tümcelerinin SELECT yan tümcesinden önce işlendiğini tanımlar. Bu nedenle HAVING yan tümcesi SELECT yan tümcesi tarafından oluşturulan bir sütun takma adını kullanamaz.

Örnek

  • Hatalı sözdizimi:

    select id id2 from table_name group by id having id2 > 0;
  • Hata iletisi:

    FAILED: ODPS-0130071:[1,44] Semantic analysis exception - column id2 cannot be resolvedODPS-0130071:[1,44] Semantic analysis exception - column reference id2 should appear in GROUP BY key

    Bu örnekte id2, SELECT yan tümcesinde oluşturulan yeni bir sütun takma adıdır ve HAVING yan tümcesinde kullanılamaz.

dynamic.pt.to.static

Açıklama: MaxCompute V2.0'da dinamik bölümler bazen optimizasyon aracı tarafından statik bölümlere dönüştürülür.

Örnek

insert overwrite table srcpt partition(pt) select id, 'pt1' from table_name;

ifadesi şuna dönüştürülür

insert overwrite table srcpt partition(pt='pt1') select id from table_name;

Geçersiz bir bölüm değeri (örneğin '${bizdate}' hatalı kullanımı) belirtirseniz MaxCompute V2.0 sözdizimi denetimi aşamasında hata bildirir. Daha fazla bilgi için bkz. Bölümler.

Hatalı sözdizimi:

insert overwrite table srcpt partition(pt) select id, '${bizdate}' from table_name limit 0;

Hata iletisi:

FAILED: ODPS-0130071:[1,24] Semantic analysis exception - wrong columns count 2 in data source, requires 3 columns (includes dynamic partitions if any)

MaxCompute'in önceki sürümlerinde LIMIT 0 yan tümcesi nedeniyle SQL ifadesi herhangi bir veri çıkarmaz ve dinamik bölüm oluşturulmaz. Bu nedenle hata bildirilmez.

lot.not.in.subquery

Açıklama: Bu sorun bir IN alt sorgusunda NULL değerlerinin nasıl işlendiğiyle ilgilidir.

Standart SQL IN işlemlerinde değer listesi NULL içeriyorsa dönüş değeri false değildir. Dönüş değeri yalnızca NULL veya true olabilir. Örneğin 1 in (null, 1, 2, 3) ifadesi true, 1 in (null, 2, 3) ifadesi NULL ve null in (null, 1, 2, 3) ifadesi NULL döndürür. Benzer şekilde bir NOT IN işleminde liste NULL içeriyorsa dönüş değeri yalnızca false veya NULL olur ve asla true olmaz.

MaxCompute V2.0 bu sorunu standart SQL davranışına göre işler. Bu uyarıyı alırsanız IN işlemindeki alt sorgunun null değerler döndürüp döndürmediğini belirlemek için sorgularınızı kontrol edin. Null değerler oluştuğunda davranışın beklentinizle aynı olup olmadığını kontrol edin. Değilse gerekli değişiklikleri yapın.

Örnek

  • accepted sütunu NULL değerler içermiyorsa bu sorunu yoksayabilirsiniz. Sütun null değerler içeriyorsa daha önce true döndüren c not in (select accepted from c_list) ifadesi artık MaxCompute V2.0'da NULL döndürür.

    select * from t where c not in (select accepted from c_list);
  • Doğru sözdizimi

    select * from t where c not in (select accepted from c_list where accepted is not null)