Any help would be appreciated. The below error now i am getting. I don't know whats wrong in it."/>
  简体   繁体   中英

Distinct rows get from a column. Oracle

I want to display distinct rows based on the operator. Like

<code>样品</ code>

$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' "); 

Any help would be appreciated.

The below error now i am getting. I don't know whats wrong in it.

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");

My guess is that you want to specify the particular columns and use distinct (or 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';

EDIT:

If you want one arbitrary row, then do something like this:

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;

The row_number() function enumerates rows in groups. Each group starts over at 1. The grouping is defined by partition by , so rows with the same value of operator , cnic , and station will be in a grouping. The order by specifies the order of the numbers within a group. Here is uses a constant for the group, so it is arbitrary. The final step is where seqnum = 1 , which chooses one row from each grouping.

From : http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#SQLRF55166

Specify DISTINCT or UNIQUE if you want the database to return only one copy of each set of duplicate rows selected.

Just update you code like this :

$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' "); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM