2016-08-19 8 views
0

PHP 5.5.29でOracle 12cデータベースに接続すると、OCI8がPHP情報ページにインストールされ、検証されます。INNER JOINを使用して別のWHERE条件を追加するとOracle SELECTが失敗する

このコードは正常に動作し、しかしただ一人の学生に障害が発生し、ちょうど0行が見つけ、エラーを返すようには見えない見つけるために、別の条件を追加するマッチング学生

SELECT pcs.Student_Number as SNUMBER, pcs.STRING_VALUE as PW, s.GUARDIANEMAIL as GEMAIL, s.WEB_ID as LOGIN, s.FIRST_NAME as FN, s.LAST_NAME as LN, pec.EMAILADDRESS as EMAIL 
    FROM PVSIS_CUSTOM_STUDENTS pcs 
     INNER JOIN STUDENTS s 
      ON pcs.STUDENT_NUMBER = s.STUDENT_NUMBER 
     INNER JOIN GuardianStudent gs 
      ON s.DCID = gs.STUDENTSDCID 
     INNER JOIN PCAS_EMAILCONTACT pec 
      ON gs.GUARDIANID = pec.EXTERNALIDENT 
    WHERE pcs.SCHOOLID=9 
      AND pcs.FIELD_NAME='web_password' 
      AND s.ENROLL_STATUS=0 

のすべてを返します。私は例として "12345"を使用しています。はい、数字フィールドなので、引用する必要はありません。

おそらくそれは ANDなのでノー任意のレコードが所定の位置にこれらの条件に合致原因だ
SELECT pcs.Student_Number as SNUMBER, pcs.STRING_VALUE as PW, s.GUARDIANEMAIL as GEMAIL, s.WEB_ID as LOGIN, s.FIRST_NAME as FN, s.LAST_NAME as LN, pec.EMAILADDRESS as EMAIL 
    FROM PVSIS_CUSTOM_STUDENTS pcs 
     INNER JOIN STUDENTS s 
      ON pcs.STUDENT_NUMBER = s.STUDENT_NUMBER 
     INNER JOIN GuardianStudent gs 
      ON s.DCID = gs.STUDENTSDCID 
     INNER JOIN PCAS_EMAILCONTACT pec 
      ON gs.GUARDIANID = pec.EXTERNALIDENT 
    WHERE pcs.SCHOOLID=9 
      AND pcs.FIELD_NAME='web_password' 
      AND s.ENROLL_STATUS=0 
      AND s.STUDENT_NUMBER=12345 
+0

まずは明白な部分から始めましょう。したがって、あなたのテーブルSTUDENTにはSTUDENT_NUMBER = 12345の行があります。そして、PVSIS_CUSTOM_STUDENTには少なくとも1つのSTUDENT_NUMBERとSCHOOLID = 9の行がありますか? – mathguy

+2

最初のクエリは返された行の中で学生12345を返しますか?私は推測していない。いずれにせよ、この質問は、サンプルデータ、結果+期待される結果なしではあまり有用ではない。 – sstan

答えて

1

をあなたのSQLで明白な "不具合"。 しかし、生徒12345に(dcis、studentsdcid、guardianid、externalident、student_number)のデータが欠落しているか、いずれの表にも一致するデータがありません。内部結合を使用しているため、レコードは返されません。

2提案:

*試してみてください、それはあなたが欠落しているかもしれないものが表示されます任意のデータを返す場合は、学生12345を検索しようとすると、内側が左に加入ジョイン変更

*もう一度検索してください最初のSQL文のリストに表示されるstudent。これでもレコードが返されない場合は、SQL文の再構成が必要になる可能性があります。

+0

興味深いことに、私はそれらを左の結合に変更すると、PCAS_EMAILCONTACTテーブルから実際にその学生のデータを持っていないルックアップに失敗します。 –

0

OR条件にその最後の条件を作ってみて、

WHERE pcs.SCHOOLID=9 
     AND pcs.FIELD_NAME='web_password' 
     AND s.ENROLL_STATUS=0 
     OR s.STUDENT_NUMBER=12345 
+0

ブリリアント!しかし、それはOPに必要なことをするでしょうか? ORはANDとは異なる意味を持っています... – mathguy

+0

@mathguy、なぜそれが記録を取得しなくなったのかをOPに伝えるための解決策ではありません。それは答えからかなり明白です。ではない? – Rahul

+1

いいえ...それは明らかではありませんでした。特にそれは意味をなさないからです。営業担当者は、そのクエリはその追加の条件なしで行を返すと語った。 ORを指定して別の条件を追加すると、少なくともその条件がなくても返された行が返されるため、ORを試してみるのは何ですか? – mathguy

0

ように私は、全体のクエリ、OR条件を使用するだけでサンプル 以下の1書いていない午前参照してください。私はすべてのを見ることはできません

SELECT pcs.Student_Number as SNUMBER, pcs.STRING_VALUE as PW, 
s.GUARDIANEMAIL as GEMAIL, s.WEB_ID as LOGIN, s.FIRST_NAME as FN, 
s.LAST_NAME as LN, pec.EMAILADDRESS as EMAIL 
FROM PVSIS_CUSTOM_STUDENTS pcs 
    INNER JOIN STUDENTS s 
     ON pcs.STUDENT_NUMBER = s.STUDENT_NUMBER 
    INNER JOIN GuardianStudent gs 
     ON s.DCID = gs.STUDENTSDCID 
    INNER JOIN PCAS_EMAILCONTACT pec 
     ON gs.GUARDIANID = pec.EXTERNALIDENT 
WHERE pcs.SCHOOLID=9 
     AND pcs.FIELD_NAME='web_password' 
     AND s.ENROLL_STATUS=0 
     AND s.STUDENT_NUMBER=12345 
     OR 
     <other Student details> 
+0

あなたの回答をフォーマットしてください... – mathguy

関連する問題