0

私はSQLを書くことに関してはかなり素人なので、これは誰かにとって簡単なことでしょうか? 次のように2つのテーブルがあります。

表 1 - DeviceName、DeviceID、AlternateID

  • マイフォン、333、AAA
  • ヘルフォン、444、CCC

表 2 - PhoneID、ProgramName

  • 333、アングリーバード
  • CCC、エバーノート

ご覧のとおり、Table2 は Table1 とは異なる 2 つの PhoneID タイプ (DeviceID と AlternateID) を使用しています。次のような出力になるSQLステートメントを探しています。

  • マイフォン、AngryBirds
  • ヘルフォン、エバーノート

任意の支援に感謝します。

乾杯、マーク

4

2 に答える 2

4
SELECT deviceName, programName
FROM table2 t2
JOIN table1 t1
 ON(t1.DeviceID=t2.PhoneID OR t1.AlternateID=t2.PhoneID)

または(読みにくいが短い)

SELECT deviceName, programName
FROM table2 t2
JOIN table1 t1
 ON(t2.PhoneID IN (t1.DeviceID, t1.AlternateID))

それでも、DeviceIDとAlternateIDが同じセットからのものである場合は、データベースのリファクタリングを検討する必要があります。デバイスが2つだけでなく複数の有効なIDを持つ可能性がある場合はどうなりますか?

于 2012-06-26T22:50:49.247 に答える
0

333 と AAA の両方が表 2 で定義されている場合はどうなりますか? DeviceName ごとに 1 つの行のみを返したいと仮定します。つまり、外部結合を使用して表 2 に 2 回結合する必要があります。

select DeviceName, 
       t2a.ProgramName, 
       t2b.ProgramName as AltProgramName
  from table1 t1
  left outer join table2 t2a
    on t1.DeviceID = t2a.PhoneID
  left outer join table2 t2b
    on t1.AlternateID = t2b.PhoneID

ProgramName を 1 つだけリストし、両方が存在する場合にどちらを使用するかの優先順位を設定できる場合は、次のようにします: (DeviceID が AlternateID に勝ると仮定して)

select DeviceName, 
       coalesce(t2a.ProgramName, t2b.ProgramName) as AltProgramName
  from table1 t1
  left outer join table2 t2a
    on t1.DeviceID = t2a.PhoneID
  left outer join table2 t2b
    on t1.AlternateID = t2b.PhoneID

最初のプログラム列に常に値を含め、両方が存在する場合は 2 番目の列にのみ値をリストする場合は、次のようにします。

select DeviceName, 
       coalesce(t2a.ProgramName, t2b.ProgramName) as ProgramName1,
       case when t2a.ProgramName is not null then t2b.ProgramName end as ProgramName2
  from table1 t1
  left outer join table2 t2a
    on t1.DeviceID = t2a.PhoneID
  left outer join table2 t2b
    on t1.AlternateID = t2b.PhoneID


編集

クエリはレポート目的で使用されていると想定しました。その場合、デバイスごとに 1 行だけが必要になる可能性が高くなります。

OPがデバイスごとに複数の行を返す必要がある理由を理解しました。いずれかの名前でデバイスを検索するためのビューを定義するためにクエリが使用される場合、複数の行が必要になります。

Jan の答えは、ルックアップ ビューで完全に機能します。ただし、データベース エンジンのクエリ オプティマイザとテーブルのサイズによっては、うまく機能しない場合があります。テーブルが非常に大きい場合は、インデックス付きルックアップが必要になります。OR 条件による結合は、一部のシステムでインデックス付きルックアップを妨げる場合があります。UNION ALL を使用した同等のクエリは、より多くのシステムでインデックス付きルックアップをサポートする場合があります。

select DeviceName,
       ProgramName
  from table1 t1
  join table2 t2
    on t1.DeviceID = t2.PhoneID
union all
select DeviceName,
       ProgramName
  from table1 t1
  join table2 t2
    on t1.AlternateID = t2.PhoneID
于 2012-06-27T03:08:10.297 に答える