sql >> データベース >  >> RDS >> PostgreSQL

2つのSELECTクエリを組み合わせる

    見た目では、ある駅からシティスクエアに向かう5つの路面電車と、シティスクエアから他の駅に向かう5つの路面電車を一覧表示する出力を作成する必要があります。この場合、これら2つのものの間で(たとえば、時間どおりに)接続を確立していません。疑似列 row_number()OVER()で結合する必要があります。 頭に浮かぶ:

    SELECT '$name' AS name1, w1.time1, 'City Square - arrival' AS name2, w1.time2,
           'City Square - departure' AS name3, w2.time3, '$name2' AS name4, w2.time4
    FROM (
      SELECT dt1.time AS time1, dt2.time AS time2, row_number() OVER () AS rn
      FROM departure_times AS dt1
      JOIN departure_times AS dt2 USING (tram_id)
      WHERE dt1.name = '$name' AND dt2.name = 'CitySquare'
      LIMIT 5) w1
    JOIN (
      SELECT dt1.time AS time3, dt2.time AS time4, row_number() OVER () AS rn
      FROM departure_times AS dt1
      JOIN departure_times AS dt2 USING (tram_id)
      WHERE dt1.name = 'CitySquare' AND dt2.name = '$name2'
      LIMIT 5) w2 USING (rn);
    

    各サブクエリで、対象の5行を選択します。明らかなプロパティがないため、 JOINできます これらの2セットの行では、その目的に役立つ疑似列を作成する必要があります(結合するものが必要です。そうしないと、 CROSS JOINが取得されます。 結果として、出力に5 x 5行が表示されます)。 row_number()OVER()AS rn> それはまさにそれを行います:それはエイリアス rnで新しい列を作成します これには、行セット全体の行番号が含まれます( OVER() LIMITのために5行 句)。これは両方のサブクエリで実行するため、結合条件として使用できます: USING(rn) 。出力でこの列を使用する必要はありません。

    どの5つのトラム時間をリストするかを制御することはできません。それが必要な場合は、 WHERE dt1> CURRENT_TIMEのようなことを行う必要があります およびORDERBY dt1 両方のサブクエリ、またはその線に沿った何かで。



    1. MySQLは未使用のテーブルを検索します

    2. mysqlデータベースへの画像のアップロードが機能しない

    3. 値が24:00:00を超える.Netタイムスパンを格納するための正しいSQLタイプは何ですか?

    4. SQL Server 2005 / 2008 - 複数のファイル グループ?