繁体   English   中英

在SQL LEFT JOIN中仅显示一个结果

[英]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作为例子。 但我的查询显示allone

关于查询的结果如下:

        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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM