2017-09-22 6 views
0

destinationcountryidの値が638,101、-1のようなレコードがテーブルにあります。 selectクエリに一致しないものがこのレコードを返す必要がある場合、-1がデフォルト値です。SQLクエリを記述して他のものが見つからない場合に選択する方法

私は以下のSQLクエリを書いています。

SELECT 
    externalid 
FROM 
    mLookup.Addon_Spec_Tbl 
WHERE 
    productid = 30046 AND keyid = 2 AND countryid = 638 AND clientid = 10018 AND subkeyid = 4 AND destinationcountryid IN(302, 
    -1) 
ORDER BY 
    id DESC 
LIMIT 1 

ここでは正しい結果が得られません。 私のテーブルスキーマは、私が応答を取得しますが、そのdestinationcountryid = -1のレコードを返しています

INSERT INTO spec_tbl(
productid, keyid, subkeyid, externalid, countryid, destinationcountryid, originid, destinationid, clientid, categoryid, remarks) 
VALUES 
(30046, 2, 4 , 'ABC', 638, 603, NULL, NULL, 10018, 25,'International Round Trip(include India) One Way Trip'), 
(30046, 2, 4 , 'LMP', 638, 302, NULL, NULL, 10018, 25,'International Round Trip(include Bangladesh) One Way Trip'), 
(30046, 2, 4 , 'KJP', 638, 208, NULL, NULL, 10018, 25,'International Round Trip(include Cuba) One Way Trip') 
(30046, 2, 4 , 'XYZ', 638, -1, NULL, NULL, 10018, 25,'International Round Trip'), 
; 

挿入

CREATE TABLE spec_tbl(
    id SERIAL NOT NULL, 
    productid INTEGER NOT NULL, 
    keyid INTEGER, 
    subkeyid INTEGER, 
    externalid CHARACTER VARYING(100), 
    countryid INTEGER, 
    destinationcountryid INTEGER, 
    originid INTEGER, 
    destinationid INTEGER, 
    clientid INTEGER, 
    categoryid INTEGER, 
    created TIMESTAMP WITHOUT TIME zone DEFAULT NOW(), 
    modified TIMESTAMP WITHOUT TIME zone DEFAULT NOW(), 
    enabled BOOLEAN DEFAULT TRUE, 
    CONSTRAINT spec_tbl_pkey PRIMARY KEY(id)) 

サンプル以下の通りです。 が見つかりましたが、現在のdestinationcountryid = 302と一致しています。これを結果に期待します。

+2

私はあなたがここで何を求めているのか分かりません。そのクエリがレコードを返さず、ロジックが正しいことを100%確信している場合は、データが問題になります。いずれにしても、期待される出力とともにサンプルデータを表示して質問を言い換えることができれば、それは事柄を明確にするのに役立ちます。 –

+0

サンプルレコードを追加しました –

+0

私はそれがMySQLであると推測しています。タグで特定してください。 – PacoDePaco

答えて

0

あなたが望むロジックは、現在のクエリがレコードと正常に一致した場合、そのレコードの外部ID値を返し、そうでない場合は-1を返します。この動作をシミュレートするには、クエリをCTEに配置します。次に、CTEがレコードを返さない場合にのみ起動する-1を返すクエリで、そのクエリの和集合を実行します。

WITH cte AS (
    SELECT externalid 
    FROM Spec_Tbl 
    WHERE 
     productid = 30046 AND 
     keyid = 2 AND 
     countryid = 638 AND 
     clientid = 10018 AND 
     subkeyid = 4 AND 
     destinationcountryid = 302 
    ORDER BY id DESC 
    LIMIT 1 
) 

SELECT externalid::int 
FROM cte 
UNION ALL 
SELECT -1 
WHERE (SELECT COUNT(*) FROM cte) = 0; 
+0

これに最終的なクエリとして書き込む方法は? –

+0

私はあなたの質問を理解していません。 –

+0

上記のコピーをSQLプロンプトで実行します。それはエラーを与える。 ERROR:UNION型の可変文字と整数を一致させることはできません。 LINE 18:SELECT -1 –

関連する問題