2016-05-23 9 views
-1

certificatestoreの2つのテーブルがあります。 store_idがstore_id列またはfk_store_id列にある証明書をstore表に戻す問合せを作成する必要があります。このクエリは、person_idとstore_idでフィルタリングする必要があります。SQL Serverクエリで予期した結果が取得されない

私は既にいくつかのクエリを試してきましたが、適切な証明書を正しいストアにバインドしません。

これは私の証明書テーブルです:

STORE_ID | CERTIFICATE_ID | PERSON_ID 
---------|----------------|---------- 
1464  | 87083   | 100258 
336  | 87123   | 100258 

これが私の店のテーブルです:

STORE_ID | FK_STORE_ID | STORE_DESC 
---------|-------------|--------------- 
336  | 1464  | A First Store 
1117  | 1464  | Store two 
1464  | 340   | The Third 

私はこのクエリを構築しました:

SELECT 
    S.STORE_ID 
    ,S.FK_STORE_ID, C.STORE_ID AS CERTIFICATE_STORE_ID 
    ,C.PERSON_ID 
    ,CERTIFICATE_ID 
FROM CERTIFICATE C 
    INNER JOIN STORE S ON C.STORE_ID = S.STORE_ID OR C.STORE_ID = S.FK_STORE_ID 
WHERE 
    C.PERSON_ID = 100258  
    AND C.STORE_ID = 1464 

このクエリでは取得しています

STORE_ID | FK_STORE_ID | STORE_ID | PERSON_ID | CERTIFICATE_ID 
---------|-------------|----------|-----------|---------------- 
336  | 1464  | 1464  | 100258 | 87083 
1117  | 1464  | 1464  | 100258 | 87083 
1464  | 340   | 1464  | 100258 | 87083 
テーブル構造を変更せずに、

STORE_ID | FK_STORE_ID | CERTIFICATE_STORE_ID | PERSON_ID | CERTIFICATE_ID 
---------|-------------|----------------------|-----------|---------------- 
336  | 1464  | 336     | 100258 | 87123 
1464  | 340   | 1464     | 100258 | 87083 

これを取得する方法があります:

私はこれを取得することが期待しましたか?

ありがとうございました!

+6

は、なぜあなたは1117 STORE_IDを得ることを期待していないのですか? –

+1

あなたのデータに基づいて、 'STORE_ID'を期待していないという意味もありません。 – Stivan

+0

また、あなたのフィルタには' CSTTI_ID = 1464'があります。これは 'CERTIFICATE_ID 87083'にのみ関連しています – mo2

答えて

2

を、あなたが必要なORフィルタではなく、上のように見えました結合。

だから、ここの回答形式の私のコメントは...

SELECT 
    S.STORE_ID 
    ,S.FK_STORE_ID, C.STORE_ID AS CERTIFICATE_STORE_ID 
    ,C.PERSON_ID 
    ,CERTIFICATE_ID 
FROM CERTIFICATE C 
    INNER JOIN STORE S ON C.STORE_ID = S.STORE_ID 
WHERE 
    C.PERSON_ID = 100258  
    AND (C.STORE_ID = 1464 OR C.FS_STORE_ID = 1464) 
0

SELECT 
    S.STORE_ID, S.FK_STORE_ID, C.STORE_ID AS CERTIFICATE_STORE_ID, 
    C.PERSON_ID, CERTIFICATE_ID 
FROM dbo.Certificates c 
    INNER JOIN dbo.Store s ON C.STORE_ID = S.STORE_ID 
UNION ALL 
SELECT 
    S.STORE_ID, S.FK_STORE_ID, C.STORE_ID AS CERTIFICATE_STORE_ID, 
    C.PERSON_ID, CERTIFICATE_ID 
FROM dbo.Certificates c 
    INNER JOIN dbo.Store s ON C.STORE_ID = S.FK_STORE_ID 
WHERE C.PERSON_ID = 100258 
    AND S.STORE_ID = 1464 
0

・ホープ、この与えられたコードは、あなたの目標に役立つだろう、このようないくつかのものになるかもしれませんね:上記のコメントのよう

SELECT a.store_id, 
     a.fk_store_id, 
     b.store_id, 
     b.certificate_id, 
     b.person_id 
    FROM (SELECT store_id, fk_store_id 
      FROM store 
     WHERE store_id IN 
        (SELECT store_id 
        FROM certificate 
        WHERE store_id IN (SELECT store_id FROM store) 
          OR  store_id IN (SELECT fk_store_id FROM store) 
          AND person_id = '100258' 
          AND store_id = '1464')) a, 
     (SELECT store_id, CERTIFICATE_ID, PERSON_ID 
      FROM certificate 
     WHERE store_id IN (SELECT store_id FROM store) 
       OR  store_id IN (SELECT fk_store_id FROM store) 
        AND person_id = '100258' 
        AND store_id = '1464') b 
WHERE a.store_id = b.store_id; 
関連する問題