Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在查询(不编辑表)中,如何连接没有任何相似性的数据?_Sql_Oracle - Fatal编程技术网

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