在查询(不编辑表)中,如何联接没有任何相似性的数据?



我有一个查找表的查询,下面是一个示例。

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 |

基本上,我想摆脱第一个行下的行,并将非 NULL 数据连接到右侧。问题是 Jon 行上没有 Yes 值所在的列,所以我不知道如何将它们放在那里。有什么建议吗?

附言。使用我使用的数据,我不能只是在"Jon"行中输入"YES"并调用它一天,我需要从较低的行中找到特定值,并以某种方式在 NULL 框中获取该值。

你只是想要COALESCE()吗?

COALESCE(Happy, 'Yes') as happy

COALESCE()NULL值替换为另一个值。

如果要加入 NULL 值,请使用嵌套选择。内部选择获取 NULL 的 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,则可以使用WHERE rownum = 1选择相对于此顺序的第一行。如果您不应用 ORDER BY,则该顺序是随机的。


阅读您的新评论后...

从某种意义上说,在我的真实数据中,其他名称下的"是"将是一件设备的数量。我希望设备编号在一行中,而不是像 8 行一样只有 4 个"是"值,其余为空。

。我得出的结论是,这是一个XY问题。

你问的是你认为可以解决你的问题的细节,而不是解释问题并询问如何解决它。

如果你想每人存放几件设备,你需要三张桌子。

您需要一个Person表、一个Article表和一个连接表,将物品与人员联系起来,以装备它们。让我们称这张表为Equipment.

Person
------
PersonId (Primary Key)
Name
optional attributes like age, hair color
Article
-------
ArticleId (Primary Key)
Description
optional attributes like weight, color etc.
Equipment
---------
PersonId (Primary Key, Foreign Key to table Person)
ArticleId (Primary Key, Foreign Key to table Article)
Quantity (optional, if each person can have only one of each article, we don't need this)

假设我们有

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

现在乔恩有一顶帽子,一台相机和一双鞋子。凯尔有2个包和一个相机。布拉德什么都没有。

您可以像这样查询人员及其设备

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

请参阅示例:http://sqlfiddle.com/#!4/7e05d/2/0

由于您使用 oracle 标签标记了问题,因此您只需使用 NVL((,它允许您指定一个值来替换您从中选择的列中的 NULL 值。

假设您想要第一行,因为它包含最小的年龄:- 将您的查询包装在 CTE 中 - 在另一个 CTE 中获取查询的第一行 - 在另一个 CTE 中获取查询
的最大值HappySad(对于您的示例数据,它们都是'YES'
(- 交叉连接最后 2 个 CTE


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

(假设 Name 是 3 个表中的键列(

相关内容

最新更新