SQL Select - 其中子查询有多行
SQL Select - where subquery has multiple row
我正在尝试构建一个简单的 select,提示 child 字段和 parent 字段的 returns 结果。在我们的大多数情况下,只列出了一个 parent,但当出现多个时,我会收到 'single-row subquery returns more than one row' 错误,我不确定如何解决。
Select Date, location, MiscData, ChildField, ParentField
from Maintable t1
where childfield = (select t2.parentfield from maintable t2 where t2.childfield = @('prompt', childfield))
正如我提到的,我们的绝大多数数据只有一个 parent 字段,但如果有多个字段,就会出错。可以这么说,我已经开始被自己的脚绊倒,并且可能以完全错误的方式思考这个问题,并且可以使用一些指示或至少向正确的方向推动。
只是为了更清楚地说明我的代码; parent 字段曾经包含在 child 字段中,这就是我试图获得的结果。当 parent 字段是 child 字段时,它将没有 parent 字段。
我制作了下面的样本集,试图提供我正在处理的一些项目的想法。有了这个集合,人们可能会想象出不止一个 parent 可以构成一个 child,这就是为什么我们可能有多个行。 “不,这不是为了酒吧——只是一个样本集”
示例数据集:
试试这个
Select Date, location, MiscData, ChildField, ParentField
from Maintable t1
where childfield in (select t2.parentfield from maintable t2 where t2.childfield = @('prompt', t1.childfield))
出现这个问题的主要原因是你的子查询返回了多个结果集
解决方法多种多样,下面一一介绍解决方法。
1 个子查询中的 TOP 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))
希望以上解决方案对您有所帮助。
你的解释有点难懂,但是看你的数据,好像你的一些行被其他行替换了。
+------------+----------+------------+-------------+
| 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 | |
+------------+----------+------------+-------------+
如果您正在寻找 'abc',您需要...
- 第一行('A-old'),因为还是abc,没有被替换
- 第三行('B-new'),它正在替换第二行(父字段->子字段,同一日期)
- 第六行 ('D-new'),它正在替换第五行(父字段->子字段,同一日期)
+------------+----------+
| 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;
我查看了所提供的一些建议,我能从中得到的最好的建议来自 Rajat。
Select Date, location, MiscData, ChildField, ParentField
from Maintable t1
INNER JOIN maintable t2 ON t2.parentfield = t1.childfield
where t2.childfield = @('prompt', childfield))
我没有收到任何数据,我发现这是因为臭名昭著的 'space' 角色把一切都搞砸了。
我正在尝试构建一个简单的 select,提示 child 字段和 parent 字段的 returns 结果。在我们的大多数情况下,只列出了一个 parent,但当出现多个时,我会收到 'single-row subquery returns more than one row' 错误,我不确定如何解决。
Select Date, location, MiscData, ChildField, ParentField
from Maintable t1
where childfield = (select t2.parentfield from maintable t2 where t2.childfield = @('prompt', childfield))
正如我提到的,我们的绝大多数数据只有一个 parent 字段,但如果有多个字段,就会出错。可以这么说,我已经开始被自己的脚绊倒,并且可能以完全错误的方式思考这个问题,并且可以使用一些指示或至少向正确的方向推动。
只是为了更清楚地说明我的代码; parent 字段曾经包含在 child 字段中,这就是我试图获得的结果。当 parent 字段是 child 字段时,它将没有 parent 字段。
我制作了下面的样本集,试图提供我正在处理的一些项目的想法。有了这个集合,人们可能会想象出不止一个 parent 可以构成一个 child,这就是为什么我们可能有多个行。 “不,这不是为了酒吧——只是一个样本集”
示例数据集:
试试这个
Select Date, location, MiscData, ChildField, ParentField
from Maintable t1
where childfield in (select t2.parentfield from maintable t2 where t2.childfield = @('prompt', t1.childfield))
出现这个问题的主要原因是你的子查询返回了多个结果集
解决方法多种多样,下面一一介绍解决方法。
1 个子查询中的 TOP 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))
希望以上解决方案对您有所帮助。
你的解释有点难懂,但是看你的数据,好像你的一些行被其他行替换了。
+------------+----------+------------+-------------+ | 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 | | +------------+----------+------------+-------------+
如果您正在寻找 'abc',您需要...
- 第一行('A-old'),因为还是abc,没有被替换
- 第三行('B-new'),它正在替换第二行(父字段->子字段,同一日期)
- 第六行 ('D-new'),它正在替换第五行(父字段->子字段,同一日期)
+------------+----------+ | 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;
我查看了所提供的一些建议,我能从中得到的最好的建议来自 Rajat。
Select Date, location, MiscData, ChildField, ParentField
from Maintable t1
INNER JOIN maintable t2 ON t2.parentfield = t1.childfield
where t2.childfield = @('prompt', childfield))
我没有收到任何数据,我发现这是因为臭名昭著的 'space' 角色把一切都搞砸了。