使用LIMIT在JOINED表中获取NULL值

时间:2019-04-30 17:23:45

标签: postgresql join

我从中学到了很多类似的问题,但是我的结果集没有返回预期的结果。

我的目标:

构建一个查询,该查询将返回结果集,其中包含表demo1 =“ admin”的表user_id中的所有行,以及表demo2的表user_id的唯一行=“管理员”。 demo2中的每一行都有一个唯一的user_id,因此始终只有一行,其中“ admin”为user_id

但是,我不希望demo2的数据在demo1的每一后续行上重复浪费。我只希望结果集的第一行包含demo2数据作为非空值。 demo2列的空值仅应返回结果集中第2行以上的值。

当前状态:

现在,我的查询返回了适当的列(所有demo1和所有demo2),但是 从demo2返回的所有数据都是null

演示1:

id  user_id  product  quantity  warehouse
1   admin    phone    3         A
2   admin    desk     1         D 
3   k45      chair    5         B

演示2:

id  user_id  employee  job   country
1   admin    james     tech  usa
2   c39      cindy     tech  spain

查询:

SELECT * 
from  demo1
left join  (SELECT * FROM demo2 WHERE demo2.user_id = 'X' LIMIT 1) X
on (demo1.user_id = x.user_id)
WHERE demo1.user_id = 'admin'

理论价格:

子查询的LIMIT 1是我仅尝试检索第1行的demo2值,认为其余的将是null。相反,所有值都是null

当前结果:

id  user_id  product quantity warehouse id    employee  job   country
1   admin    phone   3        A         null  null      null  null
2   admin    desk    1        D         null  null      null  null

所需结果:

id  user_id  product quantity warehouse id    employee  job   country
1   admin    phone   3        A         1     james     tech  usa
2   admin    desk    1        D         null  null      null  null

我尝试用left join代替left inner joinright joinfull join,但没有任何方法返回期望的结果。

2 个答案:

答案 0 :(得分:1)

您的联接将带来满足您两个表的联接条件的所有记录。没有改变。

但是您可以禁止结果集中的后续记录显示加入后满足连接条件的匹配demo2记录:

SELECT demo1.id ,
    demo1.user_id,
    demo1.product,
    demo1.quantity,
    demo1.warehouse 
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY demo1.user_id ORDER BY demo1.id) = 1 THEN demo2.id END as demo2_id,    
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY demo1.user_id ORDER BY demo1.id) = 1 THEN demo2.employee END AS demo2_employee,  
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY demo1.user_id ORDER BY demo1.id) = 1 THEN demo2.job END as demo2_job,
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY demo1.user_id ORDER BY demo1.id) = 1 THEN demo2.country END as demo2_country
from  demo1
left join  demo2 
    on demo1.user_id = demo2.user_id
        AND demo2.user_id = 'X'
WHERE demo1.user_id = 'admin'

这只是对原始sql的快速重写,其中包括附加的CASE表达式。

话虽如此,由于demo2无法满足此查询中的两个条件,因此该sql不会为demo2.user_id生成任何结果:

  1. 具有demo1.user_id = demo2.user_id的where谓词的连接条件demo1.user_id = 'admin'

  2. 还保留值X

它要么是admin,但满足您的第一个加入条件,但第二个却没有通过。或者是X并满足您的第二个条件,但也不满足您的第一个条件。

答案 1 :(得分:1)

这是另一种不错的方法: sqlfiddle