我从中学到了很多类似的问题,但是我的结果集没有返回预期的结果。
我的目标:
构建一个查询,该查询将返回结果集,其中包含表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 join
,right join
,full join
,但没有任何方法返回期望的结果。
答案 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
生成任何结果:
具有demo1.user_id = demo2.user_id
的where谓词的连接条件demo1.user_id = 'admin'
还保留值X
。
它要么是admin
,但满足您的第一个加入条件,但第二个却没有通过。或者是X
并满足您的第二个条件,但也不满足您的第一个条件。
答案 1 :(得分:1)
这是另一种不错的方法: sqlfiddle