2017-08-10 36 views
0

我有一个表,说ABC多列内部联接返回重复记录

id smcreatorid smownerid 
1 33998  33998 
2 33998  3 
3 33997  33998 
4 33940  33998 
5 33997  3 
6 1   33997 
7 12   33997 
8 33998  33940  

和表vt_tmp_u33998

id 
33997 
33998 
3 

我想获取所有那些smownerid等于vt_tmp_u33998的ID或创纪录是。

我的查询是

SELECT ABC.smownerid, ABC.smcreatorid FROM ABC 
INNER JOIN vt_tmp_u33998 ON vt_tmp_u33998.id = ABC.smownerid or (vt_tmp_u33998.id = ABC.smcreatorid and ABC.smcreatorid = 33998) 

该查询返回重复的记录。

smcreatorid smownerid 
33998   33998 
33998   3 
33997   33998 
33940   33998 
33997   3 
33998   3 
1    33997 
12   33997 
33998   33940 

我想要的是不使用不同的列或一组ID,获取其smownerid等于vt_tmp_u33998的id人或者设计人是所有记录。

+0

***我想获取所有记录其所有者和创作者都是33998 *** - 对我来说似乎是一个'AND'逻辑,而不是'OR' –

回答

0

由于您只需要表ABC的记录,因此不需要表vt_tmp_u33998。你只需要在表格ABC中搜索你需要的结果。你的逻辑更改为:

SELECT ABC.smownerid, ABC.smcreatorid FROM ABC WHERE (ABC.smownerid = 33998 or ABC.smcreatorid = 33998) 
+0

加入是根据我的要求mendatory。 –

0
SELECT smownerid,smcreatorid 
FROM abc 
JOIN vt_tmp_u33998 
ON vt_tmp_u33998.id = smownerid 
AND smcreatorid =smownerid 
AND smownerid=33998 
+0

它会返回其所有者和创建者为33998的记录,但我需要所有者或创建者为33998的所有记录。 –

+0

我希望输出如问题中所示,除了在“33998 3”处重复显示 –

+0

我没有明白您的观点第一评论。我觉得两者都是一样的。但是,请给我任何输出示例。 – Amit

0

除非你需要从另一个表中的任何数据(无论是显示还是比赛),还有使用JOIN没有意义的。

以下应该足够您需要有33998作为所有者或creater。

SELECT ABC.smcreatorid, ABC.smownerid 
FROM ABC 
WHERE ABC.smownerid = 33998 
OR ABC.smcreatorid = 33998 

如果33998应该是所有者和创造者,那么它应该是。

SELECT ABC.smcreatorid, ABC.smownerid 
FROM ABC 
WHERE ABC.smownerid = 33998 
AND ABC.smcreatorid = 33998 

比方说,你需要从ABC这要么creatorowner3399833998记录必须是有效的idvt_tmp_u33998表,则查询会。

SELECT ABC.smcreatorid, ABC.smownerid 
FROM ABC 
WHERE (ABC.smownerid = 33998 
OR ABC.smcreatorid = 33998) 
AND 33998 IN (SELECT id FROM vt_tmp_u33998) 

同样,当两者都应该是33998,应该从另一个表则有效的ID ...

SELECT ABC.smcreatorid, ABC.smownerid 
FROM ABC 
WHERE ABC.smownerid = 33998 
AND ABC.smcreatorid = 33998 
AND 33998 IN (SELECT id FROM vt_tmp_u33998) 
+0

有成千上万的记录。子查询将减慢进程。 –

+0

仅当需要确保id 33998是有效的id并存在于vt_tmp_u33998表中时才需要子查询。如果在ABC上有一个引用vt_tmp_u33998中的id且具有级联的外键约束,那么您将不需要子查询,因为外键约束事先已完成您的工作,并且在ABC中的33998保证其有效密钥存在于vt_tmp_u33998。 – JRG

0

See Below Image

SELECT smownerid,smcreatorid 
FROM abc 
JOIN vt_tmp_u33998 
ON vt_tmp_u33998.id = smownerid 
AND (smownerid=33998 OR smcreatorid=33998) 
+0

如果我们添加记录为33997作为smownerid。您的查询不会返回33997的记录。我想要记录其smownerid等于vt_tmp_u33998或smownerid = 33998的abc表。 –

+0

请参阅上面提供的结果集映像。 – Amit