sql select-where子查询有多行

pes8fvy9  于 2021-08-09  发布在  Java
关注(0)|答案(4)|浏览(416)

我试图构建一个简单的select,它提示输入childfield并返回父字段的结果。在大多数情况下,只列出一个父项,但当多个父项出现时,“单行子查询返回多行”错误,我不确定如何解决。

Select Date, location, MiscData, ChildField, ParentField
from Maintable t1
where childfield = (select t2.parentfield from maintable t2 where t2.childfield = @('prompt', childfield))

正如我所提到的,我们的绝大多数数据都只有一个父字段,但当有多个父字段时,就会出错。可以说,我已经开始被自己的脚绊倒了,而且可能是用完全错误的方式思考这个问题,可能需要一些指针或者至少是朝着正确的方向推动。
只是为了对我的代码做一点澄清;parentfield曾经包含在childfield中,这就是我试图获得的结果。当parentfield是childfield时,它就没有parentfield了。
我制作了下面的示例集,试图提供一些我正在处理的项目的想法。有了这一套,我们可以想象一个孩子可以由多个父母组成,这就是为什么我们可能会有多个行。”不,这不是给酒吧的-只是一个样本集“

样本数据集:

vwkv1x7d

vwkv1x7d1#

试试这个

Select Date, location, MiscData, ChildField, ParentField
    from Maintable t1
    where childfield in (select t2.parentfield from maintable t2 where t2.childfield = @('prompt', t1.childfield))
djp7away

djp7away2#

出现此问题的主要原因是子查询返回多个结果集
有各种各样的解决方案让我们看看下面的解决方案一个接一个。

1子查询中的前1个

Select Date, location, MiscData, ChildField, ParentField
from Maintable t1
where childfield = (select TOP(1) t2.parentfield from maintable t2 where t2.childfield = @('prompt', childfield))

2内部联接而不是子查询

Select Date, location, MiscData, ChildField, ParentField
    from Maintable t1
    INNER JOIN maintable t2 ON t2.parentfield = t1.childfield 
    where t2.childfield = @('prompt', childfield))

我希望以上的解决方案能对你有所帮助。

5tmbdcev

5tmbdcev3#

你的解释有点难以理解,但看看你的数据,你的一些行似乎已经被其他行取代了。

+------------+----------+------------+-------------+
|    date    | location | childfield | parantfield |
+------------+----------+------------+-------------+
| 2020-05-01 | A-old    | abc        |             |
| 2020-05-02 | B-old    | abc        | def         |
| 2020-05-02 | B-new    | def        |             |
| 2020-05-03 | C-old    | def        |             |
| 2020-05-04 | D-old    | abc        | ghi         |
| 2020-05-04 | D-new    | ghi        |             |
+------------+----------+------------+-------------+

如果你在找,你想。。。
第一行('a-old'),因为它仍然是并且没有被替换。
第三行('b-new'),替换第二行(parentfield->childfield,same date)
第六行('d-new'),替换第五行(parentfield->childfield,同一日期)

+------------+----------+
|    date    | location |
+------------+----------+
| 2020-05-01 | A-old    |
| 2020-05-02 | B-new    |
| 2020-05-04 | D-new    |
+------------+----------+

如果是这样,那么我建议使用自外部联接:

select
  t1.date,
  coalesce(t2.location, t1.location) as location
from maintable t1
left join maintable t2 on t2.childfield = t1.parentfield and t2.date = t1.date
where t1.childfield = 'abc'
order by t1.date;
gmxoilav

gmxoilav4#

我回顾了一些提供的建议,我能做的最好的是由拉贾特。

Select Date, location, MiscData, ChildField, ParentField
    from Maintable t1
    INNER JOIN maintable t2 ON t2.parentfield = t1.childfield 
    where t2.childfield = @('prompt', childfield))

我没有收到任何数据,我发现这是由于臭名昭著的'空间'字符,把一切都抛出了怪圈。

相关问题