[英]Show only one result in sql LEFT JOIN
Table A
id | kind | item_name
---+-------+----------
1 | one | item_1
2 | one | item_2
Table B
tableA_id | kind | price
----------+-------+------
1 | all | $10
1 | one | $2
然后我有这样的查询
SELECT a.id, a.kind, a.name, b.price FROM table_a a
LEFT JOIN table_b b ON b.tableA_id = a.id
AND (a.kind = b.kind OR a.kind = 'all')
WHERE a.id = 1
基本上我想显示的价格all
,如果那种不存在table b
,但是,如果kind
,然后存在仅显示价格one
作为例子。 但我的查询显示all
和one
。
关于查询的结果如下:
id | kind | item_name | price
---+-------+-----------+------
1 | all | item_1 | $10
1 | one | item_1 | $2
我希望这个
id | kind | item_name | price
---+-------+-----------+------
1 | one | item_1 | $2
更新:
基本上,我想显示所有价格,如果表b中不存在该种类,但是如果存在该种类,则仅显示一个价格作为示例。
为此,您可以使用CASE
表达式执行此操作:
SELECT a.id, a.kind, a.item_name,
CASE WHEN b.price IS NULL
THEN (SELECT b2.Price
FROM table_b AS b2
WHERE b2.kind = 'all')
ELSE b.price
END AS PRice
FROM table_a a
LEFT JOIN table_b b ON b.tableA_id = a.id
AND b.kind = 'one'
WHERE a.id = 1
从理论上讲,这应该可行,但是您要进行两个联接:
SELECT a.id, a.kind, a.name, COALESCE(b1.price, b2.price) AS price
FROM table_a AS a
LEFT JOIN table_b AS b1
ON b1.tableA_id = a.id
AND b1.kind = a.kind
LEFT JOIN table_b AS b2
ON b1.tableA_id = a.id
AND b1.kind = 'all'
WHERE a.id = 1;
可能会更有效率。 基本上,您首先要找到是否存在与实物价格相匹配且回落到'all'
价格的商品。
此外-如果table_b
总是要品价格'all
”,你可以改变左连接到内连接。
要为您的方案选择单行,您将需要在查询中进行另一个自我联接,并进行额外的比较检查,以选择表b中是否存在另一种类型的单行,否则显示出kind = all
的行
SELECT a.id, a.kind, a.item_name, b.price
FROM table_a a
INNER JOIN table_b b ON b.tableA_id = a.id
LEFT JOIN table_b b1 ON b.tableA_id = b1.tableA_id
AND b.kind < b1.kind
WHERE b1.tableA_id IS NULL;
确保关键字“ all”以a
开头,则此b.kind < b1.kind
可以正常工作,因为如果这样做
select 'all' < 'one'; // will return true
select 'all' > 'one'; // will return false
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.