Sql 在查询(不编辑表)中,如何连接没有任何相似性的数据?
我有一个查找表的查询,下面是一个示例Sql 在查询(不编辑表)中,如何连接没有任何相似性的数据?,sql,oracle,Sql,Oracle,我有一个查找表的查询,下面是一个示例 Name |Age |Hair |Happy | Sad | Jon | 15 | Black |NULL | NULL| Kyle | 18 |Blonde |YES |NULL | Brad | 17 | Blue |NULL |YES | 姓名和年龄来自数据库中的一个表,头发颜色来自连接的第二个表,快乐和悲伤来自第三个表。我的目标是使图表的第一行如下所示: Name |Age |Hair |Happy |Sad | Jon |
Name |Age |Hair |Happy | Sad |
Jon | 15 | Black |NULL | NULL|
Kyle | 18 |Blonde |YES |NULL |
Brad | 17 | Blue |NULL |YES |
姓名和年龄来自数据库中的一个表,头发颜色来自连接的第二个表,快乐和悲伤来自第三个表。我的目标是使图表的第一行如下所示:
Name |Age |Hair |Happy |Sad |
Jon | 15 |Black |Yes |Yes |
基本上,我希望去掉第一行下面的行,并将非空数据连接到右侧。问题是Jon行中没有“是”值所在的列,因此我不知道如何将它们放到那里。有什么建议吗 注:对于我正在使用的数据,我不能只在“Jon”行中输入“YES”就结束了,我需要从较低的行中找到具体的值,并以某种方式在空框中获得该值。你只想合并吗
COALESCE将空值替换为另一个值。因为您用oracle标记了问题,所以您可以使用,它允许您指定一个值来替换您从中选择的列中的空值。如果您想加入空值,请使用嵌套选择。内部选择获取空值的Id,外部选择连接
select COALESCE(x.Happy, yn_table.description) as happy, ...
from
(select
t1.Happy,
CASE WHEN t1.Happy is null THEN 1 END as happy_id
from t1 ...) x
left join yn_table
on x.xhappy_id = yn_table.id
如果将ORDER BY应用于查询,则可以选择与此订单相关的第一行,其中rownum=1。如果您没有按应用订单,则订单是随机的
读了你的新评论后
意思是,在我的真实数据中,其他名称下的“是”将是一台设备的编号。我希望设备的编号在一行中,而不是有8行,只有4个“是”值,其余为空
。。。我得出的结论是,这是一个错误
你问的是一个你认为可以解决问题的细节,而不是解释问题和如何解决问题
如果你想每人储存几件设备,你需要三张桌子
您需要一个人员表、一个物品表和一个与人员相关的物品连接表来装备他们。让我们称之为桌上设备
假设我们有
Person: PersonId | Name
1 | Jon
2 | Kyle
3 | Brad
Article: ArticleId | Description
1 | Hat
2 | Bottle
3 | Bag
4 | Camera
5 | Shoes
Equipment: PersonId | ArticleId | Quantity
1 | 1 | 1
1 | 4 | 1
1 | 5 | 1
2 | 3 | 2
2 | 4 | 1
现在乔恩有一顶帽子,一架照相机和一双鞋。凯尔有两个包和一个照相机。布拉德一无所有
您可以像这样查询人员及其设备
SELECT
p.PersonId, p.Name, a.ArticleId, a.Description AS Equipment, e.Quantity
FROM
Person p
LEFT JOIN Equipment e
ON p.PersonId = e.PersonId
LEFT JOIN Article a
ON e.ArticleId = a.ArticleId
ORDER BY p.Name, a.Description
结果将是
PersonId | Name | ArticleId | Equipment | Quantity
---------+------+-----------+-----------+---------
3 | Brad | NULL | NULL | NULL
1 | Jon | 4 | Camera | 1
1 | Jon | 1 | Hat | 1
1 | Jon | 5 | Shoes | 1
2 | Kyle | 3 | Bag | 2
2 | Kyle | 4 | Camera | 1
请参见示例:假设您想要第一行,因为它包含最小的年龄: -将查询包装在CTE中 -在另一个CTE中,获取查询的第一行 -在另一个CTE中,获取样本数据查询的最大值Happy和Sad,它们都是“是” -交叉连接最后2个CTE 您可以尝试以下方法:
SELECT A.Name,
A.Age,
B.Hair,
C.Happy,
C.Sad
FROM A
INNER JOIN B
ON A.Name = B.Name
INNER JOIN C
ON A.Name = B.Name
假设名称是3个表中的关键列我是SQL初学者,非常感谢您的帮助!搜索关于内部连接删除第一行下的行:选择*自。。。其中Name='Jon'。或从…中选择*。。。其中rownum=1 order by…@OlivierJacot Descombes非常确定rownum是与order by一起使用的。您知道SQL表/结果集定义为无序,而不是使用order by for sure结果转换为非确定性随机结果。。但是非唯一值上的ORDER BY也可能导致非确定性随机,理想情况下,应在ORDER BY中添加一个带有主键/唯一键的列,以使其始终具有确定性固定。是的,问题非常不清楚。第一行是作为数据的示例还是字面上的第一行?它也可能是快乐为空,悲伤为空或其他。这似乎是一个很好的解决方案,但对于我使用的真实数据,是一个我需要找到的特定数据点,不能只是更改
PersonId | Name | ArticleId | Equipment | Quantity
---------+------+-----------+-----------+---------
3 | Brad | NULL | NULL | NULL
1 | Jon | 4 | Camera | 1
1 | Jon | 1 | Hat | 1
1 | Jon | 5 | Shoes | 1
2 | Kyle | 3 | Bag | 2
2 | Kyle | 4 | Camera | 1
with
cte as (
<your query here>
),
firstrow as (
select name, age, hair from cte
order by age
fetch first row only
),
maxs as (
select max(happy) happy, max(sad) sad
from cte
)
select f.*, m.*
from firstrow f cross join maxs m
SELECT A.Name,
A.Age,
B.Hair,
C.Happy,
C.Sad
FROM A
INNER JOIN B
ON A.Name = B.Name
INNER JOIN C
ON A.Name = B.Name