SQL列出不同列中的组合只有一次

时间:2015-01-21 10:02:40

标签: sql unique

我的数据库看起来如下

**Customer      Order           Product**
cid(PK)         oid(PK)         pid(PK)
fname           cid(FK)         pname
lname           pid(FK)         pprice

现在我使用查询获得以下结果:

**fname     lname       oid     pname       pprice**
Bill        Gates       1111    Router      40,-
Bill        Gates       1112    Laptop      699,-
Steve       Jobs        1113    Tablet      1299,-
Steve       Jobs        1114    Watch       699,-

但我想要的是,如果此人拥有多个订单,则仅列出名字和姓氏一次。我怎么能做到这一点?

预期输出示例:

**fname     lname       oid     pname       pprice**
Bill        Gates       1111    Router      40,-
                        1112    Laptop      699,-
Steve       Jobs        1113    Tablet      1299,-
                        1114    Watch       699,-

2 个答案:

答案 0 :(得分:0)

在查询中使用ROW_NUMBER()(由fname分区,Lname Order By Oid)作为RN对行进行编号。然后在外部查询或下一个查询中,如果将结果转储到临时表,则在RN不为1时使用case语句将fname和lname设置为空字符串。

您需要额外的列,例如客户编号,以便按CustomerNo,RN,Lname,Fname

订购

答案 1 :(得分:0)

使用LAG功能可以解决此问题 LAG函数返回上一行中给定列的值 然后我们可以将前一行的这个值与当前行的值进行比较。 我们可以使用CASE语句返回值,具体取决于此比较的结果。

这是一个给出所需结果的查询:

SELECT
    CASE 
        WHEN lag(concat(cop.fname, cop.lname), 1, 0) OVER (order by cop.oid) = concat(cop.fname, cop.lname)  THEN null 
        ELSE cop.fname
    END AS fname, 
    CASE 
        WHEN lag(concat(cop.fname, cop.lname), 1, 0) OVER (order by cop.oid) = concat(cop.fname, cop.lname)  THEN null 
        ELSE cop.lname
    END AS lname,
    cop.oid, 
    cop.pname, 
    cop.pprice
FROM
    (SELECT c.fname, c.lname, o.oid, p.pname, p.pprice
    FROM customer c
    LEFT JOIN myorder o on c.cid=o.cid
    LEFT JOIN product p on o.pid=p.pid) cop

选择ORDER作为表名称并不是一个好主意,因为ORDERSQL中的关键字。所以我选择MYORDER作为包含订单的表的名称 以上查询适用于Oracle数据库