gpt4 book ai didi

mysql - SQL子查询与UNION ALL查询结合

转载 作者:行者123 更新时间:2023-11-29 07:14:11 25 4
gpt4 key购买 nike

我有两个表:带有列 id 和 cost 的 Goods 和带有 GoodID、LanguageID、Title 列的 Good_texts。所以good_texts包含good的翻译。

我有一个查询,如果当前语言可用,则选择标题;如果一种商品不可用,则选择默认标题:

    SELECT
*
FROM
good_texts
WHERE
languageid = 2
UNION ALL
SELECT
*
FROM
good_texts
WHERE
languageid = 1 AND goodid = 92
AND goodid NOT IN (
SELECT
goodid
FROM
good_texts
WHERE
languageid = 2 and goodid = 92
)

这工作正常并且只返回一行。现在我正在尝试编写查询以获取good 表中的所有数据以及good_texts 表中的标题。我正在尝试使用以下查询来执行此操作:

    SELECT
s1.id,
s1.cost,
(SELECT
s2.title
FROM
good_texts s2
WHERE
languageid = 2
UNION ALL
SELECT
s3.title
FROM
good_texts s3
WHERE
languageid = 1 AND s3.goodid = s1.id
AND s3.goodid NOT IN (
SELECT
s4.goodid
FROM
good_texts s4
WHERE
languageid = 2 AND s4.goodid = s1.id
))
FROM
goods s1

但这不适用于错误

more than one row returned by a subquery used as an expression

我无法理解为什么我的子查询返回不止一行,即使它单独运行它也会返回一行。我的目标如何实现?

最佳答案

您想要的查询如下所示:

SELECT gt.*
FROM good_texts gt
WHERE gt.languageid = 2
UNION ALL
SELECT gt.*
FROM good_texts gt
WHERE gt.languageid = 1 AND
NOT EXISTS (SELECT 1
FROM good_texts gt2
WHERE gt2.goodid = gt.goodid AND gt2.languageid = 2
);

第一个获取语言 ID 为“2”的所有内容。第二个获取语言 ID 为“1”但不为“2”的所有商品。

在 Postgres 中,使用 DISTINCT ON 可以更轻松地完成此操作:

SELECT DISTINCT ON (gt.goodid) gt.*
FROM good_texts gt
WHERE gt.languageid IN (1, 2)
ORDER BY gt.goodid, (CASE WHEN gt.languageid = 2 THEN 1 ELSE 2 END);

关于mysql - SQL子查询与UNION ALL查询结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38551098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com