2017-08-10 82 views
0

我已经表说ABC多个列内连接返回重复记录

id smownerid smcreatorid 
1 33997   1 
2 33997   1 
3 33997   1 
4 33998   1 
5 33998   1 
6 33998   33998 
7 33998   33998 
8 33998   33998 
9 33998   33998 
10 33940   33998 
11 33940   33998 
12 3    33998 
13 33940   1 
14 33940   33998 
15 33997   33997 
16 3    33997 
17 33940   33998 
18 4    33940 
19 4    33997 
20 33980  33940 

另一个表non_admin_users

id 
3 
33940 
33997 
33998 
33999 

我的SQL查询

SELECT abc.* from abc 
INNER JOIN non_admin_users vt_tmp_u33998 ON vt_tmp_u33998.id = abc.smownerid 
OR (
vt_tmp_u33998.id = abc.smcreatorid 
AND vt_tmp_u33998.id =33998 
) 

这个查询返回重复 记录。

我想要的是从abc表中获取所有记录,其smownerid等于non_admin_users的id或其smognorid为33998,而不使用where子句或distinct列或group by语句。

我想这下输出

id smownerid smcreatorid 
1 33997   1 
2 33997   1 
3 33997   1 
4 33998   1 
5 33998   1 
6 33998   33998 
7 33998   33998 
8 33998   33998 
9 33998   33998 
10 33940   33998 
11 33940   33998 
12 3    33998 
13 33940   1 
14 33940   33998 
15 33997   33997 
16 3    33997 
17 33940   33998 
+0

这是一个有点混乱,你的查询是指在问题(vtiger_crmentit)中没有报价表,为什么棘手的别名非admin_users? –

+0

对不起,查询。加入non_admin_users是必要的。 –

回答

0
INNER JOIN non_admin_users vt_tmp_u33998 ON (vt_tmp_u33998.id = abc.smownerid AND abc.smcreatorid !=33998) OR (vt_tmp_u33998.id = abc.smcreatorid AND vt_tmp_u33998.id =33998) 
+0

我很困惑smcreatorid = 33998。如果你只提到on_admin_users.id = 33998而不是smcreatorid,那么它会容易得多。我认为abc表可以有on_admin_users表中不存在的记录,我相信我们发布答案的所有人都有类似的想法,因此所有发布的代码都集中在abc表的smcreator字段,否则他们可能会只需做一个简单的选择和连接,而不需要像你所做的那样的子查询。我可能是错误的 – Learning

0

试试这个:

SELECT a.smownerid, a.smcreatorid 
FROM abc a JOIN non_admin_users na ON a.smownerid = na.id 
WHERE a.smownerid = 33998; 

,如果你想所有的记录,您可以注释掉WHERE条件。

+0

我想要从abc表中获取所有记录,其** ** smownerid **等于non_admin_users的** id **或smcreator等于33998. –

0

你可以试试吗?

SELECT a.* 
FROM abc a LEFT JOIN non_admin_users na ON a.smownerid = na.id 
WHERE a.smcreatorid = 33998 OR IFNULL(na.id,'') != ''; 

[或]只是为了确保33998记录不会连接两次。

select * from 
(SELECT a.* 
FROM abc a INNER JOIN non_admin_users na ON a.smownerid = na.id AND a.smcreatorid!=33998 
UNION ALL 
SELECT b.* FROM abc b INNER JOIN abc b1 ON b.id=b1.id AND b.smcreatorid=33998) a 
order by id; 
+0

OP状态“不使用where子句”.. –

0

也许一个隐含的不同之处在工会是确定

select * from 
(
SELECT a.id, A.smownerid, A.smcreatorid 
FROM ABC a 
INNER JOIN non_admin_users n on n.id = a.smownerid and a.smcreatorid <> 33998 
union 
SELECT a.id, A.smownerid, A.smcreatorid 
FROM ABC a 
inner JOIN non_admin_users n on n.id = a.smownerid 
) s 
order by id 
; 

+------+-----------+-------------+ 
| id | smownerid | smcreatorid | 
+------+-----------+-------------+ 
| 1 |  33997 |   1 | 
| 2 |  33997 |   1 | 
| 3 |  33997 |   1 | 
| 4 |  33998 |   1 | 
| 5 |  33998 |   1 | 
| 6 |  33998 |  33998 | 
| 7 |  33998 |  33998 | 
| 8 |  33998 |  33998 | 
| 9 |  33998 |  33998 | 
| 10 |  33940 |  33998 | 
| 11 |  33940 |  33998 | 
| 12 |   3 |  33998 | 
| 13 |  33940 |   1 | 
| 14 |  33940 |  33998 | 
| 15 |  33997 |  33997 | 
| 16 |   3 |  33997 | 
| 17 |  33940 |  33998 | 
+------+-----------+-------------+ 
+0

ABC表中应该有记录的拉赫。工会将放慢绩效。 @ P.Salmon –