查询以选择不同的登录名时出现问题

时间:2019-07-12 12:11:13

标签: sql oracle

我需要为每个cod_user登录名选择一个与他的登录名不匹配的登录名。例如:a-> acc(表中的实际位置是abb)。

对于SoapUi数据库中的某些测试,我需要它。 我从这个开始,但是现在不能再走了。

SELECT U1.COD_USER, U2.LOGIN
FROM   USERS U1
       INNER JOIN USER U2
       ON U1.LOGIN != U2.LOGIN

表名用户

+----------+-------+
| cod_user | login |
+----------+-------+
| a        | abb   | 
| b        | acc   | 
| c        | add   | 
| d        | ahh   | 
| e        | agg   | 
| f        | ann   | 
+----------+-------+

但是该查询为我提供了他未使用的每个用户的所有登录信息,而我只需要一个。谢谢。

3 个答案:

答案 0 :(得分:1)

这是您想要的吗?

SELECT U1.COD_USER,
       MAX(U1.LOGIN) KEEP (DENSE_RANK FIRST ORDER BY DBMS_RANDOM.RANDOM) as UNUSED_LOGIN
FROM USERS U1
WHERE NOT EXISTS (SELECT 1
                  FROM USER U2
                  WHERE U1.COD_USER = U2.COD_USER AND
                        U1.LOGIN = U2.LOGIN
                 )
GROUP BY U1.COD_USER

答案 1 :(得分:0)

在两个表中,您都必须具有匹配的列。像Cod_user必须是公共字段,并且需要在连接逻辑上使用。因此,只需如下修改您的SQL

SELECT U1.COD_USER, U2.LOGIN
FROM USERS U1 INNER JOIN
     USER U2
     ON ( U1.COD_USER=U2.COD_USER and U1.LOGIN!= U2.LOGIN)

答案 2 :(得分:0)

我知道您想为每个用户分配来自同一表的属于其他用户的一些随机登录,并且此分配的值应该是不同的。所以:

with t as (
    select cod_user, login, count(1) over () cnt,
           row_number() over (order by dbms_random.value) rn
      from users )
select a.cod_user, a.login, b.login as random_login
  from t a 
  left join t b on a.rn = b.rn + 1 or (a.rn = 1 and b.rn = b.cnt)
  order by a.cod_user

dbfiddle demo

我为行分配了随机行号,然后在a.rn = b.rn + 1上进行自联接。第一行必须例外地连接到最后一行,这就是使用count() over ()的原因。也许您也可以使用mod()

分配是随机的(由于使用dbms_random进行排序)并且是唯一的。如果严重运行此查询,您将获得不同的,随机的,唯一的值。