2017-08-29 153 views
2

我有以下三個表:是否可以在select語句中包含子查詢?

dbo_CURRENCYRATES 
+-------------+---------+---------------+ 
|CURRENCY_ID |BUY_RATE |DATE_EFFECTIVE | 
+-------------+---------+---------------+ 
|GBP   |1.5  |01/01/2000  | 
|USD   |2.5  |01/01/2000  | 
|EUR   |0.5  |01/01/2000  | 
|GBP   |1.7  |01/01/2017  | 
|USD   |2.7  |01/01/2017  | 
|EUR   |0.7  |01/01/2017  | 
+-------------+---------+---------------+ 

dbo_DISCOUNTRATES 
+-------------+--------------+ 
|DISCOUNT  |DISCOUNT_RATE | 
+-------------+--------------+ 
|50   |0.5   | 
|25   |0.25   | 
|35   |0.35   | 
+-------------+--------------+ 

dbo_CUSTOMER 
+-------+---------------+---------+----------+ 
|ID  |NAME   |CURRENCY | DISCOUNT | 
+-------+---------------+---------+----------+ 
|1  |Widgets INC |USD  |50  | 
|2  |Widgets GMBH |EUR  |35  | 
|3  |Widgets PLC |GBP  |25  | 
+-------+---------------+---------+----------+ 

和查詢

CurrentExchangeRate 
+--------------------------------------------+ 
SELECT 
    a.CURRENCY_ID 
    ,a.BUY_RATE 
FROM dbo_CURRENCYRATES AS t 
    INNER JOIN 
     (
     SELECT 
      CURRENCY_ID 
     ,MAX(DATE_EFFECTIVE) AS MaxDate 
     FROM dbo_CURRENCYRATES 
     GROUP BY dbo_CURRENCYRATES.CURRENCY_ID 
    ) AS tm 
      ON (a.CURRENCY_ID = b.CURRENCY_ID) 
      AND (a.DATE_EFFECTIVE = b.MaxDate); 

我具有從dbo_CUSTOMER選擇數據的選擇查詢,其包括貨幣和折扣。

SELECT 
    dbo_CUSTOMER.ID 
    ,dbo_CUSTOMER.NAME 
    ,dbo_CUSTOMER.CURRENCY_ID AS [CURRENCY] 
    ,BUY_RATE 
    ,dbo_CUSTOMER.DISCOUNT 
    ,DISCOUNT_RATE 
FROM dbo_CUSTOMER 
WHERE ID = '1'; 

是可以在此查詢,子查詢,它可以讓我得到了貨幣BUY_RATE(從一個單獨的查詢),並通過查詢另一個表的恰當的折現率包括哪些內容?

我有一個單獨的查詢來獲得貨幣匯率,因爲我需要具有特定貨幣的最新值。

所以,在僞代碼,我可以做到這一點:

SELECT 
    dbo_CUSTOMER.ID 
    ,dbo_CUSTOMER.NAME 
    ,dbo_CUSTOMER.CURRENCY_ID AS [CURRENCY] 
    ,dbo_CUSTOMER.DISCOUNT 
    ,(
    SELECT BUY_RATE 
    FROM CurrentExchangeRate 
    WHERE CurrentExchangeRate.CURRENCY_ID = [CURRENCY] 
    ) as BUY_RATE 
    ,(
    SELECT DISCOUNT_RATE 
    FROM dbo_DISCOUNTRATES 
    WHERE dbo_DISCOUNTRATES.DISCOUNT = dbo_CUSTOMER.DISCOUNT 
    ) as DISCOUNT_RATE 
FROM dbo_CUSTOMER 
WHERE ID = '1'; 

是可以做到這一點,首先在查詢其次在訪問數據庫?

謝謝

+0

是的,你可以(在一個查詢 - 我期望在訪問數據庫以及)。 – AlexT82

+0

在示例中,您顯示子查詢必須返回單個記錄 - 所有記錄的值相同。這通常是使用聚合查詢或TOP 1完成的。由於在子查詢中有動態條件,我希望您確實需要將查詢連接到表。查看http://allenbrowne.com/subquery-01.html#TopN – June7

回答

1

是的,你可以。只有提示,您需要知道您的子查詢中,您需要的是,您需要在日期字段中選擇TOP 1和ORDER BY DESC。