2

第一 表--产品

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 Table

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

注意- 因此表 ProductList 包含那些 Product Name(P_Name)、Product Prize(P_Prize) 和 Product Company(P_Company),其中 Product.D_Flag='Y' 并从 Product_Detail 表中选择 Product_Detail.D_Flag='Y' 的那些字段。否则值应该为空。

4

4 回答 4

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 子句中(您不会获得没有连接的行)。

于 2013-03-04T09:01:26.917 回答
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;
于 2013-03-04T09:53:13.217 回答
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'
于 2013-03-04T09:03:32.643 回答
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

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-03-04T09:02:51.757 回答