有两个表:certificate
和store
。我必须编写一个查询来返回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
有没有办法解决这个问题,而不改变表结构?
需要你的帮助,谢谢!
答案 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;