1

join を使用しようとしていますが、この問題に直面しています。クエリを貼り付けました

select count(*) from table_a inner 
                join table_b on table_a.number = table_b.number 
                left outer join table_c on table_a.id = table_c.id 
                     and table_a.number = table_c.number 
          order by number;

クエリのどこが間違っているのか教えてください...

-ヴィノード

4

4 に答える 4

1

あなたがここに提示した anodyne テスト ケースにあなたのクエリを転記したとき、うっかり修正してしまいました。さて、あなたは ORA-00918 バグを導入しましたが、それが修正されると、コードは正常に動作します...

SQL> create table table_a (col_1 number, id number)
  2  /

Table created.

SQL> create table table_b (col_1 number)
  2  /

Table created.

SQL> create table table_c (col_1 number, id number)
  2  /

Table created.

SQL>
SQL>
SQL> select count(*) from
  2  table_a inner join table_b on table_a.col_1 = table_b.col_1
  3  left outer join table_c on table_a.id = table_c.id
  4                         and table_a.col_1 = table_c.col_1
  5  order by col_1
  6  /
order by col_1
         *
ERROR at line 5:
ORA-00918: column ambiguously defined


SQL> select count(*) from
  2  table_a inner join table_b on table_a.col_1 = table_b.col_1
  3  left outer join table_c on table_a.id = table_c.id
  4                         and table_a.col_1 = table_c.col_1
  5  order by table_a.col_1
  6  /

  COUNT(*)
----------
         0

SQL>

注:列名としてCOL_1forを代入しました。NUMBERクエリでエスケープされていない NUMBER を使用すると、ORA-00933 ではなく ORA-1747 がスローされるため、それはあなたの問題ではないと思います。

したがって、明白なことを除外しましょう: ANSI 結合構文をサポートしていない古いバージョンの Oracle、つまり 8i 以前のバージョンで実行していますか?

于 2009-12-14T11:09:01.123 に答える
1

結果セットに含まれない値で並べ替えることはできません。結果セットは、それぞれ独自の値 NUMBER を持つ複数の行を 1 つの行に集約します。したがって、order by は論理的な意味を持ちません。この場合、クエリは 1 行しか返さないため、ORDER BY は無関係です。

于 2009-12-14T11:12:22.617 に答える
1

Are you executing this query as part of an INSERT or DELETE? If so, remove the ORDER BY. It's not needed anyway.

Error: ORA-00933: SQL command not properly ended

Cause: You tried to execute an SQL statement with an inappropriate clause.

処置: このOracleエラーを解決するためのオプションは次のとおりです:

ORDER BY 句を含む INSERT ステートメントを実行した可能性があります。これを解決するには、ORDER BY 句を削除し、INSERT ステートメントを再実行します。たとえば、次の INSERT ステートメントを実行しようとしました。

INSERT INTO supplier (supplier_id, supplier_name) VALUES (24553, 'IBM') ORDER BY supplier_id;

次のように ORDER BY 句を削除することで、INSERT ステートメントを修正できます。

INSERT INTO supplier (supplier_id, supplier_name) VALUES (24553, 'IBM');

ORDER BY 句を含む DELETE ステートメントを実行しようとした可能性があります。これを解決するには、ORDER BY 句を削除し、DELETE ステートメントを再実行します。たとえば、次の DELETE ステートメントを実行しようとしました。

DELETE FROM supplier WHERE supplier_name = 'IBM' ORDER BY supplier_id;

次のように ORDER BY 句を削除することで、DELETE ステートメントを修正できます。

DELETE FROM supplier WHERE supplier_name = 'IBM';

于 2009-12-14T05:52:50.643 に答える
1

このクエリをどのように実行しましたか?

Oracle SQL には、";" のようなステートメント区切り文字はありません。これはPL/SQLでのみ使用され、一部のツールでは、「;」で区切ると、ファイル/エディターに複数のステートメントを配置できます。それらを個別に実行できるようにするためだけに。

簡単に言うと、「;」を削除します そしてさらに試みる。次回は、クエリをどのように実行したか教えてください。クリスタルボールをチェックして、あなたの問題が何であるかを推測する必要があります.

于 2009-12-14T06:08:12.360 に答える