2

impactidそのため、9 つのテーブルを含むクエリがあり、workorderstatesテーブル内の が であってもすべてのレコードを返すように記述する必要がありますNULL

以下のクエリの前に、「オープン」であるすべての結果を取得していないことに気付きました。最初は、テーブル内のworkorderstates.impactid = impactdefiniton.impactid場所と状況で、この条件が true にならないため、返されるべきレコードが除外されたためです。実際には「オープン」です。impactidNULLworkorderstates

そのため、以下のクエリを考案しましたが、実行するたびに機能しません。一意でないテーブル エイリアスが返されますworkorder。テーブルにエイリアスを使用すると、一意ではないため、結合内の正しいテーブルに移動します。クエリが機能するように、クエリの再構築について誰か助けてもらえますか? 私は多くのバリエーションを試しましたが、興味深いことに、2番目のクエリALMOSTは機能しますが、重複したレコードを返します(この場合、同じレコードの4つ)

select workorder.workorderid, workorder.siteid, 
 FROM_UNIXTIME(workorder.CREATEDTIME/1000, '%m-%d-%Y %H:%i:%s') as createdate, 
 categoryname, IFNULL(workorderstates.impactid, "No Set") as impactid, 
 IFNULL(impactdefinition.name, "Not Set") as impactname, first_name,
 sdorganization.name, statusname, title 
from workorder,  statusdefinition, sitedefinition, sdorganization, 
 prioritydefinition, categorydefinition, sduser, aaauser, workorderstates 
left Join impactdefinition on workorderstates.impactid = impactdefinition.impactid  
left join workorder on workorder.workorderid = workorderstates.workorderid 
left join workorderstates on workorderstates.statusid = statusdefinition.statusid 
left join workorder on workorder.siteid = sitedefinition.siteid 
left join sitedefinition on sitedefinition.siteid = sdorganization.org_id  
left join workorderstates on workorderstates.categoryid = categorydefinition.categoryid
left join workorder on workorder.requesterid = sduser.userid 
left join sduser on sduser.userid = aaauser.user_id  
where statusname='Open' and workorder.createdtime >= '1352678400000' 
 and sdorganization.name='MAPL' 
order by workorder.workorderid

ほとんど機能するが醜いクエリ (重複したレコードを返す):

select workorder.workorderid, workorder.siteid, 
 FROM_UNIXTIME(workorder.CREATEDTIME/1000, '%m-%d-%Y %H:%i:%s') as createdate,  
 categoryname, IFNULL(workorderstates.impactid, "No Set") as impactid, 
 IFNULL(impactdefinition.name, "Not Set") as impactname, first_name, 
 sdorganization.name, statusname, title 
from workorder,  statusdefinition, sitedefinition, sdorganization, 
 prioritydefinition, categorydefinition, sduser, aaauser, workorderstates 
left Join impactdefinition on workorderstates.impactid = impactdefinition.impactid 
where workorder.workorderid = workorderstates.workorderid 
 and workorderstates.statusid = statusdefinition.statusid 
 and workorder.siteid = sitedefinition.siteid 
 and sitedefinition.siteid = sdorganization.org_id 
 and workorderstates.categoryid = categorydefinition.categoryid 
 and  workorder.requesterid = sduser.userid and sduser.userid = aaauser.user_id 
 and statusname='Open' and workorder.createdtime >= '1352678400000' 
and sdorganization.name='MAPL' 
order by workorder.workorderid

このクエリを機能させる方法のアイデアはありますか??? みんなありがとう!

4

2 に答える 2

1

クエリを確認しましたが、JOIN とその記述方法について基本的な誤解があると思います。ランダムに構文を推測しているようなものであり、それはコードを記述する方法ではありません。

クエリを調べて、SQL-92 構文に変換しました。結合条件についていくつか推測しなければならなかったので、それがあなたのアプリケーションにとって正しいことを保証することはできませんが、法的な質問にかなり近いものです.

あなたの例では、prioritydefinitionテーブルへの結合の条件が見つかりませんでした。それが重複行の原因である可能性があります。デカルト積と呼ばれるものを生成しています。

select workorder.workorderid, workorder.siteid, 
 FROM_UNIXTIME(workorder.CREATEDTIME/1000, '%m-%d-%Y %H:%i:%s') as createdate, 
 categoryname, IFNULL(workorderstates.impactid, "No Set") as impactid, 
 IFNULL(impactdefinition.name, "Not Set") as impactname, first_name,
 sdorganization.name, statusname, title 
from workorder
inner join statusdefinition on workorderstates.statusid = statusdefinition.statusid
inner join sitedefinition on workorder.siteid = sitedefinition.siteid
inner join sdorganization on sitedefinition.siteid = sdorganization.org_id
inner join prioritydefinition ...NO JOIN CONDITION FOUND...
inner join categorydefinition on workorderstates.categoryid = categorydefinition.categoryid
inner join sduser on workorder.requesterid = sduser.userid
inner join aaauser on sduser.userid = aaauser.user_id
inner join workorderstates on workorder.workorderid = workorderstates.workorderid
left Join impactdefinition on workorderstates.impactid = impactdefinition.impactid  
where statusname='Open' 
 and workorder.createdtime >= '1352678400000' 
 and sdorganization.name='MAPL' 
order by workorder.workorderid

これ以上 SQL 結合を作成する前に、アプリケーションを理解し、SQL の作成方法も知っている人に指導してもらう必要があります。

于 2013-02-17T17:36:22.320 に答える
0

私もクエリを再フォーマットしましたが、最初の(左側の)テーブルから(右側の)テーブルから詳細を取得しているものまでの関係を示すために、より視覚的に階層化しています。ビルが述べたように、あなたは何もしていない余分なテーブルを持っていたので、デカルト積です。

さて、あなたが立ち往生していて、本当に助けてくれる人が他にいない場合は、ここにLEFT-JOINとINNER-JOINの基本があります。Left-joinは基本的に、右側にレコードがあるかどうかに関係なく、左側のテーブルのすべてのレコードが必要だと言っています(最初にリストしたように)。一致するものがあれば、すばらしい、問題はありません...しかし、一致するものがない場合でも、クエリは実行されます。

したがって、すべてのLEFT-JOINに設定しました。作業指示が「ユーザー」によって入力されるなど、常に存在しなければならないことがわかっている場合は、必要に応じて変更できます。あなたが変えることができるように。うまくいけば、これはあなたを助けるでしょう。また、作業指示から作業指示状態へ、および作業指示状態からネストして、対応するステータス定義および作業指示状態テーブルに関連付けられているその他のものを取得する方法も確認してください。その他は作業指示に直接関連していたため、それらはその階層レベルにあります。

最後にもう1つ注意してください...すべてのフィールドがtable.fieldリファレンスであるとは限りません(読みやすくするためにエイリアスに変更しました)。すべてのフィールドを修飾して、あなたや他の人が助けようとしている、または将来あなたのコードを読んでいるので、推測するだけでなく、フィールドの起源を知ることができます(テーブルの1つにあります)

select 
      WO.workorderid, 
      WO.siteid, 
      FROM_UNIXTIME(WO.CREATEDTIME/1000, '%m-%d-%Y %H:%i:%s') as createdate,  
      categoryname, 
      IFNULL(WOS.impactid, "No Set") as impactid, 
      IFNULL(ImpD.name, "Not Set") as impactname, first_name, 
      SDO.name, 
      statusname, 
      title 
   from 
      workorder WO
         LEFT JOIN workorderstates WOS
            ON WO.workorderid = WOS.workorderid 

            LEFT JOIN statusdefinition StatD
               ON WOS.statusid = StatD.statusid 

            LEFT JOIN categorydefinition CatD
               ON WOS.categoryid = CatD.categoryid 

            LEFT JOIN impactdefinition ImpD
               ON WOS.impactid = ImpD.impactid 

         LEFT JOIN sitedefinition SiteD
            ON WO.siteid = SiteD.siteid 

            LEFT JOIN sdorganization SDO
               ON SiteD.siteid = SDO.org_id 
              and SDO.name = 'MAPL' 

         LEFT JOIN sduser U
            ON WO.requesterid = U.userid 

            LEFT JOIN aaauser AU
               ON U.userid = AU.user_id

   where 
          statusname = 'Open' 
      and WO.createdtime >= '1352678400000' 
   order by 
      WO.workorderid
于 2013-02-17T17:56:30.197 に答える