2016-07-06 22 views
18
MySQL ( IN ile = değiştirirken aynı zamanda Oracle/MSSQL çalışır) follwoing (geçerlidir) terimi tökezledi

:farkı ne:, (a, b) = (1,2)

SELECT * from mytable WHERE (a, b)=(1,2) 

Ben MySQL docs tanım burada olduğunu düşünüyorum

SELECT * from mytable WHERE a=1 and b=2 

aynıdır:

simple_expr: 
    [...] 
    | (expr [, expr] ...) 
    [...] 

Bu ne denir? Kullanmak için herhangi bir artıları ve eksileri var mı?

+0

Artıları. Daha az yazım. Eksileri. Bence dizinleri kullanılamaz - ama ilk testte 'EXPLAIN', aynı endeksleri hem sorgularda kullanılan söylüyor bence hiçbir fark burada – Strawberry

+0

olsa doğrulamak için kolay kesinli değilim ilk sözdizimi nerede daha yan tümceler daha karmaşık –

+0

var gibi görünüyor üzerinde –

cevap

14

O IN() kullanarak değerlerin birden kombinasyonuna birden fazla sütun karşılaştırmak için gerektiğinde çok kullanışlı olabilir:

SELECT * FROM YourTable 
WHERE (col1,col2) IN((1,2),(2,3),(4,4)...) 

yerine:

SELECT * FROM YourTable 
WHERE (col1 = 1 and col2 = 2) OR 
     (col1 = 2 and col2 = 3) OR 
     (col1 = 4 and col2 = 4) OR 
     .... 

Her iki sorgunun icra planı inceledikten sonra,

: Ben, iyileştirici aynı şekilde ve her iki dizin kullanıyor hem değerlendirmek Oracle'da ( IN() kullanma temelde aynı olan) olduğunu söyleyebiliriz

Ayrı koşulları:

EXPLAIN PLAN FOR 
SELECT * FROM dim_remedy_tickets_cache t 
where t.tt_id = '1' and t.region_name = 'one'; 

6 | 0 | SELECT STATEMENT   |        |  1 | 311 | 30 (0)| 00:00:01 | 
7 | 1 | TABLE ACCESS BY INDEX ROWID| DIM_REMEDY_TICKETS_CACHE  |  1 | 311 | 30 (0)| 00:00:01 | 
8 | 2 | INDEX RANGE SCAN   | DIM_REMEDY_TICKETS_HISTORYPK |  1 |  | 20 (0)| 00:00:01 | 

Kombine koşulları:

EXPLAIN PLAN FOR 
SELECT * FROM dim_remedy_tickets_cache t 
where (t.tt_id,t.region_name) in (('1','one')) 

6 | 0 | SELECT STATEMENT   |        |  1 | 311 | 30 (0)| 00:00:01 | 
7 | 1 | TABLE ACCESS BY INDEX ROWID| DIM_REMEDY_TICKETS_CACHE  |  1 | 311 | 30 (0)| 00:00:01 | 
8 | 2 | INDEX RANGE SCAN   | DIM_REMEDY_TICKETS_HISTORYPK |  1 |  | 20 (0)| 00:00:01 | 

tüm RDBMS aynı sorgular değerlendirecektir varsayalım.

Sıra kurucular başka bağlamlarda yasal. Örneğin, aşağıdaki iki ifade anlama sahip (ve iyileştirici tarafından aynı şekilde ele alınır):

Yani

:

Dezavantajları - bazı insanlar için daha az okunabilir olabilir, ama temelde hiçbir eksileri.

Artıları - Daha az kod ve IN() kullanarak birden sütun karşılaştırma kombinasyonu: Ben bu iki sorgular arasındaki herhangi bir fark yoktur sanmıyorum

+0

Yani bu da Oracle'da çalışır (SQL Server'da çalışmaz). –

+3

"IN" işlevini kullanırken çok kullanışlıdır, örn. NEREDE (a, b) IN (SELECT c1, c2 FROM ... '. – jarlh

+0

@jarlh Haklısınız, güncellendi – sagi

0

, iyileştirici aynı muhtemelen yapacağız.

Her iki sorgularda bir yürütme planı çalıştırmak ve kendini görmelisiniz. Bunun dışında

, bir tercihi daha çok. Her iki taraf için de pek çok Eksileri ve Artıları yok, bu yüzden daha iyi olanı seçin.

İlgili konular