2017-12-14 3 views
0

クエリ:MY_TABLE 戻るORA-00904無効な識別子FROM
SELECT COLUMN_NAME MY_TABLEにはCOLUMN_NAME列が存在しないため、これまでとても良い。

クエリ:
SELECT COLUMN_NAME INは(MY_TABLE FROM COLUMN_NAMEを選択)OTHER_TABLE * FROM
だけでなく、それは失敗しない、それは完全なOTHER_TABLEを返します。内部クエリが「外部」テーブルにある列を選択した場合にのみ発生します。
同じクエリを実行しても、内側のクエリの選択列をテーブルに存在しないテーブルにも存在するほかの列に変更すると、
SELECT * FROM OTHER_TABLE WHERE COLUMN_NAME IN(SELECT DIFFERENT_NAME FROM MY_TABLE) *** OTHER_TABLEにDIFFERENT_NAME列は存在しません ORA-00904は無効です。

1.外部クエリに存在するが内部クエリに存在しない列を使用するクエリはどのように失敗しないのですか?
2.完全な表をどのように返しますか?
SELECT * FROMテーブルからここ列の(サブクエリ)ここで、サブクエリリターンORA-00904

答えて

0

in句のクエリで、「外部」テーブルの列を使用できます。外部表の各行について、その行の値が内部表から選択されます(リテラル値を選択した場合と同様)。外側のクエリの行の値は同じなので、明らかに等しいので、条件が満たされ、行が返されます。そのような間違いを避けるために

良い守備の練習は完全にあなたが(好ましくは表の別名を使用して)照会している列を修飾するので、クエリではなく、あなたが期待していない何かを返すのうち、エラーになります。

SELECT * 
FROM other_table ot 
WHERE ot.column_name IN (SELECT mt.column_name -- causes error! 
          FROM my_table mt) 
0

我々は二つのテーブルがあることを想像:フィールドBとフィールドATATBを、今のは、いくつかのクエリを書いてみましょう:

select A -- wrong: TB doesn't have A field 
    from TB 

しかし、この1はOKこととBフィールドがnullでなく、TAが空でないことを提供する全体TBテーブルを返します。あなたが

where B in (select B from TA) 

が等しくなる必要があり、この場合には

select * 
    from TB 
    where B in (select B -- <- B is from TB in both cases 
       from TA) 

-- 1. null in (...) is null, not true 
    -- 2. we have not empty TA 
    where (B is not null) and Exists (select 1 from TA) 

そして最後に

select * 
    from TB 
    where B in (select C -- wrong: there's no field C in TB as well as in TA 
       from TA) 
関連する問題