2016-11-21 4 views
0

私は2つのSQL問合せを持っていますが、その1つは機能しますが、もう1つはエラーです。クエリに続いて、うまく2つのSQLクエリの違いは何ですか?

select /*ordered*/ coupon_address.coupon,merchant_address.id 
from merchant_address, 
    coupon_address, 
    customers c 
WHERE merchant_address.id = coupon_address.merchant_address 
    and c.CUSTOMER_ID = 'temp1' 
    AND sdo_within_distance(c.cust_geo_location,merchant_address.store_geo_location,'distance = 1 unit=MILE') = 'TRUE'; 

しかし、クエリが動作しない、次の作品となりますエラー

select /*ordered*/ coupon_address.coupon,merchant_address.id 
from coupon_address, 
     customers c 
    JOIN merchant_address ON merchant_address.id=coupon_address.merchant_address 
WHERE c.CUSTOMER_ID = 'temp1' 
    AND sdo_within_distance (c.cust_geo_location,merchant_address.store_geo_location, 'distance = 1 unit=MILE') = 'TRUE'; 

エラーが1行目で

ERRORです:ORA-00904: "COUPON_ADDRESS"。 「MERCHANT_ADDRESS」:無効な識別子

+1

古くから古くて壊れやすい暗黙的な結合を、明示的な「JOIN」演算子と混在させています。それをしないでください。 –

+2

ANSI構文を使用する場合は、すべてのテーブルでこの構文を使用する必要があります。同じ方法で、古いOracleの結合構文を使用することに決めた場合(これは強く推奨されます)、すべてのテーブルに対して行います – Aleksej

+0

@a_horse_with_no_name古い結合をJOINと混合することはどういう意味ですか? – raju

答えて

6

明示的と暗示的シストは、一緒に構文を結合!彼らは常に混乱とエラーにつながります:

select /*ordered*/ coupon_address.coupon,merchant_address.id 
FROM coupon_address 
JOIN merchant_address 
    ON merchant_address.id=coupon_address.merchant_address 
JOIN customers c ON c.CUSTOMER_ID = 'temp1' 
WHERE sdo_within_distance (c.cust_geo_location, 
          merchant_address.store_geo_location, 
          'distance = 1 unit=MILE') = 'TRUE'; 

理由が正しく動作しなかったのは、パーサーがクエリを評価する順序です。おそらく未知の列の表はまだ評価されていなかったでしょう。

+0

これは実際の問題を解決しないと思います。すでに作成されたコメント。 – Alfabravo

+0

これはうまくいきましたが、私が質問で書いた結合ステートメントの問題は何か分かりません。 – raju

+0

問題は、オプティマイザがクエリを評価する順序です。おそらく未知の列の表はまだ評価されていなかったでしょう。 @raju – sagi

1

JOINは、FROM節の,よりも高い優先順位を持ちます。 ONJOINの一部なので、以前の結合を含め、結合を開始するものだけが表示されます。だから、

select /*ordered*/ coupon_address.coupon,merchant_address.id 
from coupon_address, 
     customers c 
    JOIN merchant_address 
    ON merchant_address.id=coupon_address.merchant_address 

は、本質的には次のとおりです。

select /*ordered*/ coupon_address.coupon,merchant_address.id 
from coupon_address, 
     (customers c 
    JOIN merchant_address 
    ON merchant_address.id=coupon_address.merchant_address) 

coupon_addressはスコープではまだありません。

他の人は、from節のSQL-92 joinキーワードまたはそれより前のカンマとwhere節の結合基準のいずれかを使用することをお勧めします。私は明示的なjoin構文を好む。

+0

が間違っています! 1つのタイプの 'join'に固執するのは最善ではありません。適切で明示的な 'JOIN'構文を使用するのが最善です。 –

0

サギの答えは正しいです。あなたのバージョンがうまくいかない理由は、FROM句のコンマのまわりの有効範囲規則のためです。ああ、私は言及しましたか?は、FROM句にカンマを使用していません。 常には、明示的なJOIN構文を使用します。私はあなたがエラーを取得している理由は、これはそれが明らかになり考える

from coupon_address, 
    (customers c JOIN 
     merchant_address 
     ON merchant_address.id = coupon_address.merchant_address 
    ) 

:として

あなたFROM句が評価されます。

関連する問題