在子查询中使用关系运算符

时间:2017-02-17 23:22:42

标签: sql oracle subquery operators

以下是问题:

经理要求您检索低于150加元或超过300加拿大美元的所有产品的名称和价格。使用单个查询检索此用例所需的结果,并捕获查询及其执行的屏幕截图。确保以加元格式化结果。加元的货币符号与美元的货币符号相同,即“$”符号

我正在使用Oracle SQL开发人员,这是我的查询:

SELECT product_name,
to_char(price_in_us_dollars *
        (SELECT us_dollars_to_currency_ratio
         FROM Currency
         WHERE currency_name = 'Canadian Dollar'),
        'FML9999.00','NLS_CURRENCY= $')AS price_in_canadian_dollars
FROM Product
WHERE price_in_us_dollars *
      (SELECT us_dollars_to_currency_ratio
       FROM Currency
       WHERE currency_name = 'Canadian Dollar')<= 150
OR  (SELECT us_dollars_to_currency_ratio
     FROM Currency
     WHERE currency_name = 'Canadian Dollar') >= 300;

如果我执行此操作,我只能获得低于150美元的价格。如何更改此格式以便我可以获得要显示的产品&lt; 150加元或> 300加元,两者同时?

2 个答案:

答案 0 :(得分:1)

在第二个where子句(OR ...)中,你错过了与price_in_use_dollars的乘法。您的比较大于汇率,这不太可能匹配: - )

您可能会考虑的其他优化措施:   - 使用NOT BETWEEN,这样你只需要进行一次计算;   - 将计算移到右侧,这样您就可以从price_in_us_dollars索引中受益

但这两者是相互排斥的 - 如果你将计算向右移动,你将不得不为每个参数之间重复计算。

答案 1 :(得分:0)

您忘记在&gt; = 300的情况下将price_in_us_dollars的汇率乘以。

SELECT product_name,
to_char(price_in_us_dollars *
    (SELECT us_dollars_to_currency_ratio
     FROM Currency
     WHERE currency_name = 'Canadian Dollar'),
    'FML9999.00','NLS_CURRENCY= $')AS price_in_canadian_dollars
FROM Product
WHERE price_in_us_dollars *
  (SELECT us_dollars_to_currency_ratio
   FROM Currency
   WHERE currency_name = 'Canadian Dollar')<= 150
OR price_in_us_dollars * 
  (SELECT us_dollars_to_currency_ratio
   FROM Currency
   WHERE currency_name = 'Canadian Dollar') >= 300;