2017-12-14 2 views
1

ここでは、3つの異なるサブクエリを同じテーブルから3つの異なる列に分配する1つのサブクエリに変換しようとしています。同じテーブルの複数のサブクエリを1つのクエリに変換する

可能ですか?これは、Oracle

で達成できることができます

PI_NO || con_date(45) || subjvis(46) || initDate(47) 
---------------------------------------- 
1234 || 14-DEC-2017 || 12-DEC-2017||15-DEC-2017  

を: 私の実際のクエリは、この

select tu.pi_no, (SELECT pu_DATE 
        FROM tabl1 
        WHERE pi_no = tu.pi_no 
        AND si_no IN(45,46,47) 
       ) 
from public tu; 

は、出力は次のようになりたい好きに変換したい---

select p.pi_no,(SELECT pu_DATE 
       FROM tabl1 
       WHERE pi_no = p.pi_no 
        AND si_no = 45 
       ) AS con_date, 
       (SELECT pu_DATE 
       FROM tabl1 
       WHERE pi_no = p.pi_no 
        AND si_no  = 46 
       ) AS subjvis, 
       (SELECT pu_DATE 
       FROM tabl1 
       WHERE pi_no = p.pi_no 
        AND event_no  = 47 
       ) AS initDate 
from public p; 

です

+0

あなたは 'public'と' tabl1'のテーブルを結合しようとしていますか?もしそうなら、どのフィールドに参加していますか? – Vashi

+0

@Vashi 'pi_no = p.pi_no'に基づいて結合しようとしています。 PI_NOはpublicとtabl1で利用可能です。 –

+0

この最後のスカラークエリは、この条件、 'AND event_no = 47'を持ちます。これは、「AND si_no = 47」とされていますか? –

答えて

1

サブクエリを結合で置き換えます

SELECT 
    tu.pi_no, 
    t1.pu_date AS con_date, 
    t2.pu_date AS subjvis, 
    t3.pu_date AS initDate 
FROM 
    public tu 
    LEFT JOIN tabl1 t1 ON tu.pi_no = t1.pi_no AND t1.si_no = 45 
    LEFT JOIN tabl1 t2 ON tu.pi_no = t2.pi_no AND t2.si_no = 46 
    LEFT JOIN tabl1 t3 ON tu.pi_no = t3.pi_no AND t3.si_no = 47 

選択リストのサブクエリから複数の列を返すことはできません。

0

あなたがpi_noフィールドに参加している場合は、以下の結合が有効です。与えられたpi_noの場合、si_noという特定の値が見つからないと、NULLが設定されます。試してみてください:集計関数、MAXと

SELECT tu.pi_no, 
CASE WHEN a.si_no = 45 THEN a.pu_DATE ELSE NULL END AS con_date, 
CASE WHEN a.si_no = 46 THEN a.pu_DATE ELSE NULL END AS subjvis, 
CASE WHEN a.si_no = 47 THEN a.pu_DATE ELSE NULL END AS initDate 
FROM 
PUBLIC tu 
LEFT JOIN 
tabl1 a 
ON tu.pi_no = a.pi_no; 
+0

'tabl1'は' public'よりも多くのレコードを持っています。これはあまりにも多くのレコードを生成します –

+0

説明に基づいてリレーションの種類(一対多、一対一など)は明確ではありません。どちらのテーブルの中で 'pi_no'をすべて表示させたいのですか?あなたのメインテーブル。 – Vashi

+0

OPは 'si_no = 45'、' si_no = 46'と 'si_no = 47'を問い合わせるので、' public'に 'pi_no'ごとに最低3つのレコードがなければなりません。私。 3つの列のうち少なくとも2つがNULLの場合にのみクエリが機能します。そして、「si_no = 50」のようなものがもっとあるかもしれません。 –

1

使用条件ロジック、表の粒度でスカラー副問合せの値を取得するには、PUBLIC

目標は、オブジェクトのすべてのレコードを返すことです、public (その名前はkeywordであるため理想よりも小さい)。オブジェクトの推定鍵PUBLICpi_noであるため、この列をgroup by句に配置して、クエリの精度を確実に一致させます。

値のあるレコードを得るために条件付きロジックの最大値をとります(tabl1のキーがpi_no, si_noの場合)。ここで

がソリューションです:

SELECT 
    p.pi_no, 
    MAX(DECODE(si_no,45,t.pu_date,TO_DATE(NULL))) con_date, 
    MAX(DECODE(si_no,46,t.pu_date,TO_DATE(NULL))) subjvis, 
    MAX(DECODE(si_no,47,t.pu_date,TO_DATE(NULL))) initdate 
FROM 
    public p 
    LEFT OUTER JOIN tabl1 t ON pi_no = p.pi_no 
           AND si_no IN (45, 46, 37) 
GROUP BY 
    p.pi_no; 
関連する問題