19

innertable.id = outertable.id を指定して、内部クエリに WHERE 条件を提供したいと考えています。ただし、MySQL (5.0.45) は「'where 句' の不明な列 'outertable.id'」を報告します。このタイプのクエリは可能ですか?

内部クエリは、GROUP BY を使用して行を列にピボットしています。これは完全に外側のクエリで実行できますが、追加の結合により追加のオーバーヘッドが発生する可能性があります。

別の方法として、内側のクエリで WHERE 条件を省略し、代わりに ON outertable.id = innerquery.id を指定することもできますが、内側のクエリの行セット全体をフェッチして、外側のクエリを再度結合することになり、非効率的です。

実際の SQL は次のようになります。

select t.ticketid, u.userid, t.fullname, u.loginapi_userid, t.email, tp.subject, tp.contents, a.PhoneNumber, a.Location, a.Extension, a.BusinessUnit, a.Department
from swtickets t
inner join swticketposts tp on t.ticketid = tp.ticketid
inner join swusers u on t.userid = u.userid
left join
  (
  select
  cfv.typeid,
  min(case cfv.customfieldid when 1 then cfv.fieldvalue end) as 'PhoneNumber',
  min(case cfv.customfieldid when 3 then cfv.fieldvalue end) as 'Location',
  min(case cfv.customfieldid when 5 then cfv.fieldvalue end) as 'Extension',
  min(case cfv.customfieldid when 8 then cfv.fieldvalue end) as 'BusinessUnit',
  min(case cfv.customfieldid when 9 then cfv.fieldvalue end) as 'Department'
  from swcustomfieldvalues cfv
  where cfv.typeid = t.ticketid
  group by cfv.typeid
  ) as a on 1 = 1
where t.ticketid = 2458;
4

5 に答える 5

31

あなたの質問に対する答えはノーです。あなたがやっているように相関名を参照することはできません。派生テーブルは、外側のクエリが結合の評価を開始する前に、内側のクエリによって生成されます。tしたがって、 、tp、およびなどの相関名はu、内部クエリでは使用できません。

これを解決するには、内側のクエリで同じ定数の整数値を使用し、外側のクエリで派生テーブルを の代わりに実際の条件を使用して結合することをお勧めします1=1

SELECT t.ticketid, u.userid, t.fullname, u.loginapi_userid, t.email,
  tp.subject, tp.contents, a.PhoneNumber, a.Location, a.Extension,
  a.BusinessUnit, a.Department
FROM swtickets t
 INNER JOIN swticketposts tp ON (t.ticketid = tp.ticketid)
 INNER JOIN swusers u ON (t.userid = u.userid)
 LEFT OUTER JOIN (
  SELECT cfv.typeid,
    MIN(CASE cfv.customfieldid WHEN 1 THEN cfv.fieldvalue END) AS 'PhoneNumber',
    MIN(CASE cfv.customfieldid WHEN 3 THEN cfv.fieldvalue END) AS 'Location',
    MIN(CASE cfv.customfieldid WHEN 5 THEN cfv.fieldvalue END) AS 'Extension',
    MIN(CASE cfv.customfieldid WHEN 8 THEN cfv.fieldvalue END) AS 'BusinessUnit',
    MIN(CASE cfv.customfieldid WHEN 9 THEN cfv.fieldvalue END) AS 'Department'
  FROM swcustomfieldvalues cfv
  WHERE cfv.typeid = 2458
  GROUP BY cfv.typeid
  ) AS a ON (a.typeid = t.ticketid)
WHERE t.ticketid = 2458;
于 2009-02-12T18:57:24.253 に答える
0

私の提案は、効率性を理由にあなたが除外したものでした。たとえば、where 句を省略して結合を使用する (t.ticketid = a.ticketid のように)

非効率性についてのあなたの考えを、いくつかの具体例で証明できましたか? 私はあなたが言っていることを知っていますが、外側のクエリのすべての行を使用する方法は内側のクエリのすべての行に結合されているので、実行計画によっては、あなたが思っているほど非効率的ではないかもしれません?

于 2009-02-09T22:55:50.127 に答える
0

問題は「cfv.typeid = t.ticketid」だと思いますか?それについての私の考えは、MySQLは相関サブクエリをサポートしていますが、「内部」クエリは実際には残りのクエリの「内部」ではないため、結合で失敗する可能性があるようです。 WHERE 句で。しかし、サブクエリから where 句を取り出して、結合条件を a.typeid = t.ticketid にすることができるようです。

于 2009-02-09T23:09:36.503 に答える