[英]Using SubQuery as Field Column
我有將子查詢作為字段列的查詢,但我想在其他地方使用此字段列。
SELECT c.country_code AS
country_code,
c.dial_code AS
dial_code,
(SELECT r.destination
FROM region r
WHERE r.country_code = c.country_code
AND r.dial_code = c.dial_code) AS
destination,
c.start_time,
c.duration,
c.call_type,
c.customer_prefix AS
customer_prefix,
c.vendor_prefix AS
vendor_prefix,
(SELECT Round(r.rate, 3)
FROM rate r
INNER JOIN region re
ON r.region_id = re.id
INNER JOIN account_prefix ap
ON r.account_prefix_id = ap.id
WHERE re.country_code = c.country_code
AND re.dial_code = c.dial_code
AND ap.prefix = c.customer_prefix
AND ap.prefix_type = 0) AS
**customer_rate**,
(SELECT Round(r.rate, 3)
FROM rate r
INNER JOIN region re
ON r.region_id = re.id
INNER JOIN account_prefix ap
ON r.account_prefix_id = ap.id
WHERE re.country_code = c.country_code
AND re.dial_code = c.dial_code
AND ap.prefix = c.vendor_prefix
AND ap.prefix_type = 1) AS
**vendor_rate**,
(SELECT Round(r.rate, 3)
FROM rate r
INNER JOIN region re
ON r.region_id = re.id
INNER JOIN account_prefix ap
ON r.account_prefix_id = ap.id
WHERE re.country_code = c.country_code
AND re.dial_code = c.dial_code
AND ap.prefix = c.customer_prefix
AND ap.prefix_type = 0) - (SELECT Round(r.rate, 3)
FROM rate r
INNER JOIN region re
ON r.region_id = re.id
INNER JOIN account_prefix ap
ON r.account_prefix_id
= ap.id
WHERE
re.country_code = c.country_code
AND re.dial_code = c.dial_code
AND ap.prefix = c.vendor_prefix
AND ap.prefix_type = 1) AS **unit_profit**,
unit_profit * duration
FROM cdr c
LIMIT 100;
如您所見,我想使用 unit_profit、customer_rate 和 vendor_rate。 如何實現?
編輯:
任何顯示加入視圖的教程?
您需要做的是獲取所有在蒼蠅內部完成的子查詢,並創建與 CDR 表的連接。
這將大大提高查詢的性能和響應時間。 您現在所做的是對 CDR 中的每個記錄執行 3 個查詢。 如果這個表(CDR)只有幾條記錄是可以的,但如果沒有,這可能會消耗大量的處理器、內存和磁盤 I/O。
執行“加入”並以相同格式顯示信息的技巧是加入 3 次相同的子查詢,但使用不同的別名。
select c.country_code, customer_rate_table.customer_rate
from CDR c
left outer join on ( SELECT Round(r.rate, 3) customer_rate , re.country_code,
re.dial_code, re.dial_code, ap.prefix
FROM rate r
INNER JOIN region re
ON r.region_id = re.id
INNER JOIN account_prefix ap
ON r.account_prefix_id = ap.id
WHERE ap.prefix_type = 1
) customer_rate_table
ON customer_rate.country_code = c.country_code
AND customer_rate.dial_code = c.dial_code
AND customer_rate.prefix = c. customer_prefix
left outer join on ( {Same as above but with the right fields} ) vendor_rate_table
ON vendor_rate_table.country_code = c.country_code
AND vendor_rate_table.dial_code = c.dial_code
AND vendor_rate_table.prefix = c.vendor_prefix
然后下一張桌子...
這段代碼並不完整,但我認為可以解釋您需要做什么。
謝謝!
@leo
在性能方面,像您在查詢中擁有的相關子查詢通常很糟糕。 由於您只檢索 100 行,因此應該不會太糟糕,但如果您希望它更快,則必須重寫您的查詢。
手頭的問題可以通過以下方式輕松解決:
SELECT *, unit_profit * duration AS my_calc
FROM (
-- your query here
-- just without "unit_profit * duration"
-- and maybe without redundant column aliases
) AS sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.