【问题标题】:Getting unique results in a multi-column search在多列搜索中获得独特的结果
【发布时间】:2012-07-06 16:25:38
【问题描述】:

在查询中正确限制我的结果时遇到问题。我有一个用户表,其中包含用户名、密码、名字/姓氏等字段。该字段中的主键是 user_id。我还有一张禁止用户表,其中还有一个主键 user_id。我的查询理想地显示所有用户数据,然后根据他们的 user_id 是否显示在“禁止用户”表中显示他们的“禁止状态”。我目前对此的查询如下:

select APEX_ITEM.CHECKBOX(1,gs_users.user_id) checkbox,
 "GS_USERS"."USERNAME" as "USERNAME",
 "GS_USERS"."FIRST_NAME" as "FIRST_NAME",
 "GS_USERS"."LAST_NAME" as "LAST_NAME",
 "GS_USERS"."ADMIN_FLAG" as "ADMIN",
 "GS_USERS"."EMAIL" as "EMAIL",
    CASE
      WHEN "GS_USERS"."USER_ID" = "GS_BANNED_USERS"."USER_ID" then 'Banned'
       else 'Unbanned'
    END status
from     
 "GS_USERS" "GS_USERS",
     "GS_BANNED_USERS" "GS_BANNED_USERS"

不幸的是,这会导致大量重复值。在过去的情况下,我能够使用 ROWID 获得我独特的结果,但我不确定在 case 语句中的自定义列时如何工作。有什么方法可以得到我想要的结果吗?

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    没有 WHERE 子句,因此您在两个表之间进行笛卡尔积。

    试试这个外连接:

    select APEX_ITEM.CHECKBOX(1,gs_users.user_id) checkbox,
     "GS_USERS"."USERNAME" as "USERNAME",
     "GS_USERS"."FIRST_NAME" as "FIRST_NAME",
     "GS_USERS"."LAST_NAME" as "LAST_NAME",
     "GS_USERS"."ADMIN_FLAG" as "ADMIN",
     "GS_USERS"."EMAIL" as "EMAIL", 
     DECODE("GS_BANNED_USERS"."USER_ID",NULL,'Unbanned','Banned') as status
    from     
     "GS_USERS" "GS_USERS",
         "GS_BANNED_USERS" "GS_BANNED_USERS"
    where GS_USERS.USER_ID = GS_BANNED_USERS.USER_ID (+);
    

    【讨论】:

    • 不幸的是,这只导致显示被禁止的用户。但是,通过将外部联接移至 Banned_users 表,一切都运行良好,即显示所有用户,而不管禁令状态如何,所以我假设这是一个错字:) 无论哪种方式,都非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2019-12-01
    • 2019-11-15
    • 1970-01-01
    • 2017-06-28
    • 2017-07-28
    相关资源
    最近更新 更多