1

2 つのテーブルを使用してデータベースからクエリを取得していますが、質問のタイトルに記載されているエラーが発生しています。クエリを実行する必要があるフィールドがテーブル A にある場合もあれば、テーブル B にある場合もあります。検索する列 (テーブル A またはテーブル B のいずれか) を動的に作成し、コード内の WHERE 句は次のとおりです。エラーの原因。

列がテーブル B にある場合、テーブル B を使用して検索する、またはこれを修正することになっている INNER JOIN など、これを修正する動的な方法はありますか (現在は修正されていません)

テーブル Aフィールド: id

テーブル Bフィールド: id


SQL コード

SELECT *
FROM A INNER JOIN B ON A.id = B.id
WHERE 
<cfloop from="1" to="#listLen(selectList1)#" index="i">

    #ListGetAt(selectList1, i)# LIKE UPPER(<cfqueryparam cfsqltype="cf_sql_varchar" value="%#ListGetAt(selectList2,i)#%" />) <!---
                                                    search column name = query parameter

                                                    using the same index in both lists
                                                    (selectList1) (selectList2) --->
    <cfif i neq listLen(selectList1)>AND</cfif> <!---append an "AND" if we are on any but
                                                the very last element of the list (in that
                                                case we don't need an "AND"--->
</cfloop>

ここでも出題された問題

テーブル Aテーブル Bの両方で、2 つをリンクするデータとして id 列を使用して追加のフィールドを検索できるようにしたいと考えています。

4

3 に答える 3

6
Employee
------------------
Emp_ID  Emp_Name    Emp_DOB Emp_Hire_Date   Emp_Supervisor_ID


Sales_Data
------------------
Check_ID    Tender_Amt  Closed_DateTime Emp_ID

参照するすべての列は、テーブル エイリアスの前に置く必要があります (ただし、既にご存知のとおりです)。たとえば、次のようになります。

SELECT E.Emp_ID, B.Check_ID, B.Closed_DateTime
FROM Employee E 
    INNER JOIN Sales_Data SD ON E.Emp_ID = SD.Emp_ID

ただし、すべて (*) を選択すると、両方のテーブルからすべての列を取得しようとします。それがどのように見えるか見てみましょう:

SELECT *
FROM Employee E 
    INNER JOIN Sales_Data SD ON E.Emp_ID = SD.Emp_ID

コンパイラはこれを次のように認識します。

**Emp_ID**, Emp_Name, Emp_DOB, Emp_Hire_Date, Emp_Supervisor_ID, 
Check_ID, Tender_Amt, Closed_DateTime, **Emp_ID**

両方のテーブルからすべての列を取得しようとするため、Emp_IDが重複していますが、SQL はどの Emp_ID がどのテーブルからのものかを認識できないため、「内部結合を使用したあいまいな列名エラー」が発生します。

したがって、両方のテーブルに存在する列名があいまいになるため、(*) は使用できません。とにかく、すべての列が必要ない可能性があります。

さらに、cfloop を介して SELECT 行に列を追加する場合は、テーブル エイリアスも追加する必要があります。

--編集: 例をクリーンアップし、「SELECT * は最初のテーブルからすべての列をプルする」を「SELECT * は両方のテーブルからすべての列をプルする」に変更しました。ショーンは私が間違っていると指摘した。

于 2013-06-10T18:06:35.303 に答える
2

A.field_from_A または B.field_from_B と言えるように where 句を記述する必要があります。A.field_from_A はいつでも渡すことができます。

でも、あなたは本当に言いたくない

SELECT * FROM A INNER JOIN B ON A.id=B.id where B.id = '1'.

あなたは言いたいでしょう

SELECT * FROM B INNER JOIN A ON B.id=A.id where B.id = '1'

where 句で結合テーブルを使用しようとすると、クエリが非常に遅くなることがあります。やむを得ない場合もありますが、ベスト プラクティスは常に where 句がメイン テーブルからのみ呼び出されるようにすることです。

于 2013-06-10T17:09:06.103 に答える
1

select1 変数をアセンブルするときに、テーブル名またはエイリアスを追加します。言い換えれば、これに似ている代わりに:

select1 = "fred,barney,wilma,pebbles";

次のようにします。

select1 = "a.fred,a.barney,b.wilma,b.pebbles";
于 2013-06-11T00:05:15.653 に答える