用 SQLite 选择满足多个条件(但不是一起)的孩子的父记录
Posted
技术标签:
【中文标题】用 SQLite 选择满足多个条件(但不是一起)的孩子的父记录【英文标题】:Selecting parent records of children that meet multiple conditions (but not together) with SQLite 【发布时间】:2021-04-13 17:07:55 【问题描述】:我不知道为什么我可以围绕这个查询。我想我没有问正确的问题,这就是我努力寻找答案的原因。
我有两张桌子。 items
和 skus
。我正在尝试识别具有同时满足以下两个条件的 skus 的 items
:
-
有一个带有
price_date
的 SKU > 指定日期
有一个 SKU 的 custom
= 1。
使用下面的例子:
项目
ID | Name |
---|---|
1 | My Item 1 |
2 | My Item 2 |
skus
ID | ItemID | SKU | price_date | custom |
---|---|---|---|---|
1 | 1 | 1234 | 2020-12-11* | 0 |
2 | 1 | 5678 | 2020-05-01 | 1* |
2 | 2 | ABDC | 1900-01-01 | 0 |
我试图让我的查询从items
表中返回“我的项目 1”,因为它有一个大于我指定日期的 sku 和另一个具有等于 1 的自定义值。问题是我的如果 SKU 同时满足两个条件(意味着 1 个 sku 必须满足所有条件),则仅查询“命中”。在表格中,您可以看到 SKU ID 1 满足我的第一个条件,SKU ID 2 满足我的第二个条件,父项“我的项目 1”
即使 My Item 1 的 sku 满足条件,以下查询也不返回任何内容。
SELECT * FROM items
LEFT JOIN skus ON items.ID=skus.ItemID
GROUP BY items.ID
HAVING sku.price_date>date('2020-12-01') AND sku.custom=1
如何使查询同时查看所有子项,然后在满足所有条件时返回该项,而不管条件是否一起命中单个 sku?
【问题讨论】:
【参考方案1】:我们需要首先确定哪些 ItemID-s 符合条件,而不是 JOIN skus。我使用 MCNT 作为表前缀 Multiple Conditions Not Together...
SELECT [ItemID]
FROM [StackOver].[dbo].[MCNTskus]
Group By [ItemID]
Having
max([price_date]) > ('2020-12-01')
and
max([custom]) = 1
然后将其用作 FROM 并进行项目的 LeftJoin
With qualSKUs as
(SELECT [ItemID]
FROM [StackOver].[dbo].[MCNTskus]
Group By [ItemID]
Having
max([price_date]) > ('2020-12-01')
and
max([custom]) = 1
)
SELECT MCNTitems.ID, MCNTitems.Name
FROM qualSKUs
LEFT JOIN MCNTitems ON MCNTitems.ID=qualSKUs.ItemID
GROUP BY qualSKUs.ItemID,MCNTitems.ID, MCNTitems.Name
导致
ID Name
1 My Item 1
【讨论】:
max
是答案谢谢。只需将其添加到 HAVING
比较就可以了,因为我只是在寻找符合条件的项目。谢谢。以上是关于用 SQLite 选择满足多个条件(但不是一起)的孩子的父记录的主要内容,如果未能解决你的问题,请参考以下文章