SQL Server查询不会检索预期结果

时间:2016-05-23 14:53:50

标签: sql sql-server

有两个表:certificatestore。我必须编写一个查询来返回store_id表中store_id或fk_store_id列中store的证书。此查询必须由person_id和store_id过滤。

我已经尝试了一些查询,但它没有将正确的证书与正确的商店捆绑在一起。

这是我的证书表:

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

有没有办法解决这个问题,而不改变表结构?

需要你的帮助,谢谢!

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分: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;