Sql 选择不同登录名的查询出现问题
我需要为每个与他的登录不匹配的codu用户登录选择。示例:a->acc(表中实际为abb) 我需要它在SoapUi的数据库中进行一些测试。 我从这里开始,但现在不能再进一步了:Sql 选择不同登录名的查询出现问题,sql,oracle,Sql,Oracle,我需要为每个与他的登录不匹配的codu用户登录选择。示例: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 | +----------
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 |
+----------+-------+
但是,这个查询为每个用户提供了他没有使用的所有登录名,我只需要一个。谢谢你。这是你想要的吗
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
在这两个表中,必须有一个匹配的列。像Cod_一样,用户必须是公共字段,这需要在连接逻辑上使用。因此,只需像下面这样修改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)
我知道您希望为每个用户分配属于同一表中其他用户的一些随机登录,并且分配的值应该是不同的。因此:
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
我给行分配了随机行号,然后在a.rn=b.rn+1
上进行自连接。第一行必须异常地连接到最后一行,这就是为什么要使用count()over()
。可能您也可以使用mod()
来实现此目的
分配是随机的(由于用于排序的dbms_random),并且是唯一的。如果多次运行此查询,您将得到不同的、随机的、唯一的值。您能解释一下希望看到什么吗?这不清楚,我想看到一个cod_用户的任何登录不太清楚his@AlexDanilov这与什么无关?“示例:a->acc”由于不在示例数据中,因此
a->aac
关系来自何处?您的查询正在将用户
表连接到用户
(不带“s”)表;用户
表的结构是什么?表中包含哪些数据?这是打字错误吗?“但是现在不能再往前走了”为什么不呢?请用包含足够信息的答案回答您的问题,以证明问题的完整程度、预期结果以及解决方案不起作用的原因。首先,感谢您的回答。我使用sql developer,在这个查询之后,它给了我ORA-00904:“U2.LOGIN”无效标识。首先谢谢你,但它不会返回任何结果。你在用户表中有Code\u用户字段吗?如果是,则无结果表示没有无效登录。