2

クエリに問題があります。たとえば、これでレコードを取得できます。

SELECT 
l.*, 
ll.f_cocacola as cocacola, 
 le.name AS deposit, 
 lp.price
FROM 
 KPC AS l, 
 KPC_cocacola AS ll, 
 KPC_deposit AS le, 
 KPC_price AS lp 
WHERE 
l.cod_deposit = le.id_deposit 
AND l.code = ll.code
AND lp.code = l.code
AND l.code_deposit = '002365' 

しかし今、フィールドcodeurlを持つ別のテーブル - イントラネット - から別の日付を含める必要があり、このテーブルからurlフィールドを表示する必要があります..関係はコードフィールドにあることに注意してください。

だから私はこの方法でクエリを変更します:

SELECT l.*,ll.f_cocacola as cocacola, le.name AS deposit, 
lp.price, lintranet.url 
FROM tableX AS l, intranet_cocacola AS ll, tableX_deposit AS le, 
tableX_price AS lp, 
tableX_intranet as lintranet 
WHERE l.code_deposit = le.id_deposit
AND l.code = ll.code
AND lp.code = l.code 
AND l.code = lintranet.code
AND l.code_deposit = '456852147'

しかし、問題は、一部のレコードにはURLがなく、 URLが存在しない場合、このクエリではレコードが表示されないことです。必要なレコードに関連付けられたURLがなくても、必要なものは何ですかその記録を見るために、ありがとう

4

3 に答える 3

3

ANSI結合構文を使用してクエリを書き直し、次を使用しLEFT JOINます。

SELECT  l.*, ll.f_cocacola as cocacola, le.name AS deposit, 
        lp.price, lintranet.url 
FROM    tableX AS l,
JOIN    intranet_cocacola AS ll
ON      ll.code = l.code
JOIN    tableX_deposit AS le
ON      le.id_deposit = l.code_deposit
JOIN    tableX_price AS lp
ON      lp.code = l.code
LEFT JOIN
        tableX_intranet as lintranet
ON      lintranet.code = l.code
WHERE   l.code_deposit = '456852147'
于 2012-04-17T22:53:22.113 に答える
2

LEFT JOIN代わりに使用してください:

SELECT l.*,ll.f_cocacola as cocacola, le.name AS deposit, 
lp.price, lintranet.url 
FROM tableX AS l, intranet_cocacola AS ll, tableX_deposit AS le, 
tableX_price AS lp
LEFT JOIN tableX_intranet as lintranet ON l.code = lintranet.code -- <<<<<
WHERE l.code_deposit = le.id_deposit
AND l.code = ll.code
AND lp.code = l.code 
AND l.code_deposit = '456852147'

PS: 個人的INNER JOINには、カンマ区切りのテーブル列挙を使用して結合するよりも明示的な を好みます。クエリの動作をよりよく把握できるため

于 2012-04-17T22:52:11.640 に答える
1

すでに回答があることは承知していますが、あなたの質問はOracleデータベースに対して行われたことがわかります... LEFT JOINは標準SQLであるため機能すると思いますが、Oracleには独自のバージョンがあるため、次のように記述された同じクエリを見ることができます。

SELECT l.*,ll.f_cocacola as cocacola, le.name AS deposit, lp.price, lintranet.url 
  FROM tableX AS l, intranet_cocacola AS ll, tableX_deposit AS le, tableX_price AS lp, tableX_intranet as lintranet
 WHERE l.code_deposit = le.id_deposit
   AND l.code = ll.code
   AND lp.code = l.code 
   AND l.code_deposit = '456852147'
   AND l.code = lintranet.code(+)  //<-- this is how a left/right join is written
                                   //on Oracle's SQL, you add "(+)" next to the 
                                   //field of the table that may not have 
                                   //matching records.
于 2012-04-17T23:22:20.547 に答える