gpt4 book ai didi

sql - 使用 OR 进行左连接

转载 作者:行者123 更新时间:2023-12-04 13:38:18 24 4
gpt4 key购买 nike

我想知道如何返回 OR 中最左边条件的结果LEFT JOIN 中使用的子句如果两者都评估为 true .

到目前为止,我遇到的解决方案都涉及使用 CASE SELECT 中的声明,这确实意味着我会放弃 OR条款。

另一个解决方案涉及使用 CASE ORDER BY 中的声明.

是否有其他解决方案可以减少 CASE 的使用?声明。我问的原因是因为现在只有两个 LEFT JOIN s 但随着时间的推移会添加更多。

SELECT item.id,
item.part_number,
lang.data AS name,
lang2.data AS description
FROM item
LEFT JOIN
language lang
ON item.id = lang.item
AND (lang.language = 'fr' OR lang.language = 'en')
LEFT JOIN
language lang2
ON item.id = lang2.item
AND (lang2.language = 'fr' OR lang2.language = 'en')
WHERE item.part_number = '34KM003KL'

最佳答案

如果存在,似乎您想要法语描述,否则回退到英语。

SELECT  item.id,
COALESCE(
(
SELECT lang.data
FROM language l
WHERE l.item = i.id
AND l.language = 'fr'
),
(
SELECT lang.data
FROM language l
WHERE l.item = i.id
AND l.language = 'en'
)
) AS description
FROM item i

, 或这个:
SELECT  item.id,
COALESCE(lfr.data, len.data)
FROM item i
LEFT JOIN
language lfr
ON lfr.item = i.id
AND lfr.language = 'fr'
LEFT JOIN
language len
ON len.item = i.id
AND len.language = 'en'

如果找到法语描述的概率很高,则第一个查询效率更高(如果第一个子查询成功,则不会评估第二个子查询)。

SQL Server , OraclePostgreSQL如果你有很多法语描述,这个可能会更有效:
SELECT  item.id,
COALESCE(
lfr.data,
(
SELECT lang.data
FROM language l
WHERE l.item = i.id
AND l.language = 'en'
)
) AS description
FROM item i
LEFT JOIN
language lfr
ON lfr.item = i.id
AND lfr.language = 'fr'

此查询将使用一种有效的方法( HASH JOINMERGE JOIN )加入法语描述,并且仅在必要时回退到英语描述。

对于 MySQL , 1st3rd查询没有区别。

在所有系统中,在 language (item, language) 上创建复合索引

关于sql - 使用 OR 进行左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1228338/

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