SORU
6 EYLÜL 2011, Salı


Parçalı tanımlayıcısı bağlı değil

BÖYLECE benzer hatalar gördüm ama benim sorunum için bir çözüm bulamadım. SQL sorgu gibi:

select distinct a.maxa,b.mahuyen,a.tenxa,b.tenhuyen
,isnull(dkcd.tong,0) as tongdkcd
from phuongxa a, quanhuyen b 
left outer join (
select maxa,count(*) as tong  from khaosat where convert(datetime,ngaylap,103) between'Sep 1 2011' and 'Sep 5 2011' group by maxa
) as dkcd on dkcd.maxa=a.maxa
where  a.maxa<>'99' and left(a.maxa,2)=b.mahuyen 
order by maxa

Bu sorgu öldürdüğümde, hata sonucu: Multi-part identifier ".maka" değil bağlı.Neden?
P/s: Eğer 2 ayrı sorgu sorgu ürettim, Tamam.

select distinct a.maxa,b.mahuyen,a.tenxa,b.tenhuyen
from phuongxa a, quanhuyen b 
where  a.maxa<>'99' and left(a.maxa,2)=b.mahuyen 
order by maxa

ve

select maxa,count(*) as tong  from khaosat where convert(datetime,ngaylap,103) between'Sep 1 2011' and 'Sep 5 2011' group by maxa

CEVAP
6 EYLÜL 2011, Salı


Örtülü karıştırması açık birleşerek katıldı. Bu mümkün değil ama bunu doğru yapmak için nasıl farkında olmak gerekir.

Şey, açık birleşimler (doğru olanlar hayata kullanarak JOIN anahtar kelime) üzerinde önceliğe örtülü olanlar ('virgül' katılır, katılmak durumdur belirtilen WHERE fıkra).

İşte sorgu bir film

SELECT
  …
FROM a, b LEFT JOIN dkcd ON …
WHERE …

Muhtemelen bu böyle davranmanız için sizi bekliyor

SELECT
  …
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …

bu tablolar a b kombinasyonu tablo dkcd ile birleştirilir. Aslında neler oluyor

SELECT
  …
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …

o da zaten anladı dkcd katıldı özellikle karşı b b, o zaman sonuç katılın karma ile a ve daha fazla filtre ile WHERE fıkra. Bu durumda, 23* *ON yan herhangi bir referans bu noktada bilinmiyor geçersiz, a. Bu hata iletisini alıyorsanız nedeni budur.

Eğer senin yerinde olsaydım, muhtemelen bu sorguyu yeniden yazmak için denemek istiyorsunuz, ve olası bir çözüm olabilir:

SELECT DISTINCT
  a.maxa,
  b.mahuyen,
  a.tenxa,
  b.tenhuyen,
  ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a
  INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen
  LEFT OUTER JOIN (
    SELECT
      maxa,
      COUNT(*) AS tong
    FROM khaosat
    WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011'
    GROUP BY maxa
  ) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> '99'
ORDER BY a.maxa

Burada tablolar a b ilk katılan, sonra sonuç dkcd katıldı. Temel olarak, bu aynı sorgu gibi senin, sadece kullanarak farklı bir sözdizimi biri katıldı, hangi yapar büyük bir fark var: başvuru a.maxa dkcd'nın katılın durumdur artık kesinlikle geçerli.

@Aaron Bertrand doğru da belirttiği gibi, muhtemelen belirli bir ad ile maxa muhtemelen nitelemek ORDER BY fıkra a,.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Call Me Howard

    Call Me Howa

    18 AĞUSTOS 2012
  • mliskIT

    mliskIT

    29 Mart 2012
  • The Onion

    The Onion

    14 Mart 2006