在sql查询中选择具有条件的多个表

时间:2013-03-04 08:57:46

标签: sql select

第一桌 - 产品

P_ID   P_Name    D_Flag
 37    keyboard    N
 38    mouse       N
 39    hardisk     Y
 40    pendrive    Y
 41    printer     Y
 42    CD-DVD      Y
 43    cardreader  Y

和第二个表 Product_Detail

P_ID  P_ID  P_Prize  P_Company  D_Flag
 11    37    600       Intex     N      
 12    38    200       Enter     N
 13    39    1000      XYZ       N
 14    40    200       SONY      Y
 15    41    5000      LG        Y

然后输出应该像--------> ProductList

P_Name      P_Prize   P_Company 
hardisk      --        --
pendrive     200       SONY
printer      5000      LG
CD-DVD       --        --
cardreader   --        --

注意 - 因此,表ProductList包含Product.D_Flag ='Y'的产品名称(P_Name),产品奖品(P_Prize)和产品公司(P_Company),并且选择表Product_Detail中的那些字段,其中Product_Detail.D_Flag ='Y'。否则值应为null。

4 个答案:

答案 0 :(得分:1)

这应该这样做:

SELECT p.p_name, pd.p_prize, pd.p_company
FROM product p
LEFT JOIN product_detail pd ON p.p_id = pd.p_id AND pd.d_flag = 'Y'
WHERE p.d_flag = 'Y'

所以你正在做的是选择product中的每一行,而WHERE子句将它限制为d_flag设置为Y的那一行。

然后你就是左外连接,这意味着你得到左边的所有行(在产品中)和右边的product_detail中的任何交叉点。连接条件与行匹配,但仅与详细信息表中的d_flag为“Y”的行匹配。当你否定外连接时,这不会放在WHERE子句中(你不会得到没有连接的行)。

答案 1 :(得分:1)

SELECT P.p_name, Case When PL.p_prize is Null Then "--" Else PL.p_prize END, 
       Case When PL.p_company is Null Then "--" ELSE  PL.p_company
  FROM Product P
    LEFT JOIN Product_Detail PL ON P.p_id = PL.p_id AND PL.d_flag = 'Y'
 WHERE P.d_flag = 'Y'

答案 2 :(得分:1)

select p_name,decode(b.d_flag,'N',null,p_prize) p_prize,decode(b.d_flag,'N',null,P_Company) P_Company
from product a,product_detail b
where a.p_id=b.p_id;

答案 3 :(得分:0)

SELECT  a.P_NAME,
        COALESCE(b.P_Prize, '--') Prize,
        COALESCE(b.P_Company, '--') CompanyName
FROM    Product a
        LEFT JOIN product_Detail b
            ON a.P_ID = b.P_ID AND
                a.D_FLAG = 'Y' AND
                b.D_FLAG = 'Y'
-- WHERE additional conditions here

要进一步了解联接,请访问以下链接: