我想根据运算符显示不同的行。像
$query = oci_parse($con, "SELECT POST.*, USER_LOGIN.*, STATION.*, ROLE.*
FROM USER_LOGIN
INNER JOIN STATION ON USER_LOGIN.S_ID = STATION.S_ID
INNER JOIN POST ON USER_LOGIN.USER_ID = POST.USER_ID
INNER JOIN ROLE ON USER_LOGIN.ROLE_ID = ROLE.ROLE_ID
WHERE ROLE_NAME = 'Operator' ");
任何帮助都将不胜感激。
现在我收到以下错误。我不知道它有什么不对。
Error: ORA-00936: missing expression
$query = oci_parse($con,"SELECT * FROM
(SELECT POST.*, USER_LOGIN.*, STATION.*, ROLE.*, IR.*,
row_number() over(PARTITION BY ROLE_NAME ORDER BY ROLE_NAME) AS seqnum
FROM USER_LOGIN
INNER JOIN
STATION
ON USER_LOGIN.PS_ID = STATION.PS_ID
INNER JOIN
POST
ON USER_LOGIN.USER_ID = POST.USER_ID
INNER JOIN
ROLE
ON USER_LOGIN.ROLE_ID = ROLE.ROLE_ID
INNER JOIN
IR
ON USER_LOGIN.USER_ID = IR.USER_ID
WHERE ROLE_NAME = 'Operator') AS t
WHERE t.seqnum = 1");
答案 0 :(得分:2)
我的猜测是您要指定特定列并使用distinct
(或group by
):
SELECT DISTINCT operator, cnic, station
FROM USER_LOGIN INNER JOIN
STATION
ON USER_LOGIN.S_ID = STATION.S_ID INNER JOIN
POST
ON USER_LOGIN.USER_ID = POST.USER_ID INNER JOIN
ROLE
ON USER_LOGIN.ROLE_ID = ROLE.ROLE_ID
WHERE ROLE_NAME = 'Operator';
编辑:
如果你想要一个任意行,那么就这样做:
SELECT *
FROM (SELECT POST.*, USER_LOGIN.*, STATION.*, ROLE.*,
row_number() over (partition by operator, cnic, station order by operator) as seqnum
FROM USER_LOGIN INNER JOIN
STATION
ON USER_LOGIN.S_ID = STATION.S_ID INNER JOIN
POST
ON USER_LOGIN.USER_ID = POST.USER_ID INNER JOIN
ROLE
ON USER_LOGIN.ROLE_ID = ROLE.ROLE_ID
WHERE ROLE_NAME = 'Operator'
) t
WHERE seqnum = 1;
row_number()
函数枚举组中的行。每个组从1开始。分组由partition by
定义,因此具有相同值operator
,cnic
和station
的行将在分组中。 order by
指定组内数字的顺序。这是对组使用常量,因此它是任意的。最后一步是where seqnum = 1
,它从每个分组中选择一行。
答案 1 :(得分:1)
来自: http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#SQLRF55166
如果希望数据库仅返回所选的每组重复行的一个副本,请指定DISTINCT或UNIQUE。
只需更新代码:
$query = oci_parse($con, "SELECT DISTINCT POST.*, USER_LOGIN.*, STATION.*, ROLE.*
FROM USER_LOGIN
INNER JOIN STATION ON USER_LOGIN.S_ID = STATION.S_ID
INNER JOIN POST ON USER_LOGIN.USER_ID = POST.USER_ID
INNER JOIN ROLE ON USER_LOGIN.ROLE_ID = ROLE.ROLE_ID
WHERE ROLE_NAME = 'Operator' ");