0

次のシナリオがあり、SQLクエリを作成する必要があります。

以下の情報を保持するICCIDテーブルとICCIDプロパティテーブルがあります。

ここに画像の説明を入力してください

2012年12月に削除された状態のすべてのアクティブなiccidとiccidを調べたい。削除された状態date.to.changeのICCIDについては、ICCIDの削除日を記録するICCIDプロパティテーブル自体を入力します。

this is my attempt, but that did not worked
     select e.ID_ICCID from ICCID_PROPERTY e where 
     e.c_key ='STATE' and e.c_value='Active' or(
     e.c_key ='STATE' and 
     e.c_value='Removed' and
     e.c_key='date.to.change' and  
     to_date(e.c_value,'yyyymmdd')  >=to_date('2012-DEC-01 00:00:00', 'YYYY-MON-DD HH24:MI:SS') and 
     to_date(e.c_value,'yyyymmdd')  <= to_date('2012-DEC-31 23:59:59', 'YYYY-MON-DD HH24:MI:SS')
     ))

助けてくれてありがとう

4

2 に答える 2

1

これは、このようなキーと値のペアの設計に関する問題の1つです...

この場合の基準は複数のプロパティにまたがるため、単一のプロパティ行をチェックして検索条件に一致するかどうかを確認することはできません...単一の親行に一致するすべての子プロパティがあるかどうかを確認する必要があります。

SELECT
    i.ICCID
FROM
    ICCID i
WHERE
    EXISTS (
        SELECT 1
        FROM ICCID_PROPERTY ip
        WHERE 
            ip.ID_ICCID = i.ID_ICCID
            AND ip.c_key = 'STATE'
            AND ip.c_value = 'Active'
    ) OR (
        EXISTS (
            SELECT 1
            FROM ICCID_PROPERTY ip
            WHERE 
                ip.ID_ICCID = i.ID_ICCID
                AND ip.c_key = 'STATE'
                AND ip.c_value = 'Removed'
        ) AND
        EXISTS (
            SELECT 1
            FROM ICCID_PROPERTY ip
            WHERE 
                ip.ID_ICCID = i.ID_ICCID
                AND ip.c_key = 'date.to.change'
                AND to_date(ip.c_value,'yyyymmdd') >= 
                    to_date('2012-DEC-01 00:00:00', 'YYYY-MON-DD HH24:MI:SS') 
                AND to_date(ip.c_value,'yyyymmdd') <= 
                    to_date('2012-DEC-31 23:59:59', 'YYYY-MON-DD HH24:MI:SS')
        )
    )
于 2013-01-22T17:43:11.953 に答える
0

プロパティテーブルに3回参加できると思います-おそらく次のようなものです(テストされていません):

SELECT I.ID_ICCID
FROM ICCID I
  JOIN ICCID_Property IP ON I.ID_ICCID = IP.ID_ICCID AND IP.C_Key = 'STATE' AND IP.C_Value = 'Active'
  JOIN ICCID_Property IP2 ON I.ID_ICCID = IP.ID_ICCID AND IP2.C_Key = 'STATE' AND IP2.C_Value= 'Removed'
  JOIN ICCID_Property IP3 ON I.ID_ICCID = IP.ID_ICCID AND IP3.C_Key = 'date.to.change' AND to_date(IP3.C_Value,'yyyymmdd') >= to_date('2012-DEC-01 00:00:00', 'YYYY-MON-DD HH24:MI:SS') 
            AND to_date(IP3.C_Value,'yyyymmdd') <= 
                to_date('2012-DEC-31 23:59:59', 'YYYY-MON-DD HH24:MI:SS')

幸運を。

于 2013-01-22T17:53:13.750 に答える