SQL 中子查询的替代方案?
Alternative for sub-query in SQL?
我的查询应该 return 几列结果。还有一个要求,我必须为其中一列应用额外的过滤器。我找到了使用子查询(主select内的select)的解决方案,这里是示例:
SELECT
recid,
price,
receive_date,
(SELECT deduction FROM Cost WHERE recid = c.recid AND status = 'Y') AS deduction
FROM Cost c
INNER JOIN cost_types ct
c.recid = ct.recid
WHERE cost_year = '2018'
上面的查询必须从 Cost
table 中提取所有匹配 cost_type
table 记录且 cost_year
是 2018
的记录.最重要的是,我必须归档 deduction
,其中 status
是 Y
。我想知道还有什么其他技术可以用于此查询?我知道 UNION / UNION ALL
但那是更多的代码而且似乎是多余的。如果有人有解决这种情况的建议或更好的方法,请告诉我。另外,我想知道这是否更适合存储过程?那会被推荐吗?
A JOIN
是正常的方法,像这样:
SELECT c.recid, c.price, c.receive_date,
cd.deduction
FROM cost c INNER JOIN
cost_types ct
ON c.recid = ct.recid LEFT JOIN
cost cd
ON cd.recid = c.recid AND cd.status = 'Y'
WHERE c.cost_year = 2018;
这是在猜测列的来源。如果列来自不同的表,请调整限定符。
您或许还可以使用 window 函数:
SELECT c.recid, c.price, c.receive_date,
SUM(CASE WHEN c.status = 'Y' THEN c.deduction END) OVER (PARTITION BY c.recid) as deduction
FROM cost c INNER JOIN
cost_types ct
ON c.recid = ct.recid
WHERE c.cost_year = 2018;
为什么不直接使用 CASE
呢?:
SELECT recid, price, receive_date,
(CASE WHEN status = 'Y' THEN deduction END) AS deduction
FROM Cost c INNER JOIN
cost_types ct
ON c.recid = ct.recid
WHERE cost_year = 2018;
编辑:我怀疑你想要一些东西:
SELECT recid, price, receive_date, c1.deduction
FROM Cost c INNER JOIN
cost_types ct
ON c.recid = ct.recid OUTER APPLY
(SELECT TOP (1) c1.*
FROM Cost c1
WHERE c1.recid = c.recid AND c1.status = 'Y'
ORDER BY ?? -- Use ordering column based on you want deduction
) c1;
WHERE cost_year = 2018;
我的查询应该 return 几列结果。还有一个要求,我必须为其中一列应用额外的过滤器。我找到了使用子查询(主select内的select)的解决方案,这里是示例:
SELECT
recid,
price,
receive_date,
(SELECT deduction FROM Cost WHERE recid = c.recid AND status = 'Y') AS deduction
FROM Cost c
INNER JOIN cost_types ct
c.recid = ct.recid
WHERE cost_year = '2018'
上面的查询必须从 Cost
table 中提取所有匹配 cost_type
table 记录且 cost_year
是 2018
的记录.最重要的是,我必须归档 deduction
,其中 status
是 Y
。我想知道还有什么其他技术可以用于此查询?我知道 UNION / UNION ALL
但那是更多的代码而且似乎是多余的。如果有人有解决这种情况的建议或更好的方法,请告诉我。另外,我想知道这是否更适合存储过程?那会被推荐吗?
A JOIN
是正常的方法,像这样:
SELECT c.recid, c.price, c.receive_date,
cd.deduction
FROM cost c INNER JOIN
cost_types ct
ON c.recid = ct.recid LEFT JOIN
cost cd
ON cd.recid = c.recid AND cd.status = 'Y'
WHERE c.cost_year = 2018;
这是在猜测列的来源。如果列来自不同的表,请调整限定符。
您或许还可以使用 window 函数:
SELECT c.recid, c.price, c.receive_date,
SUM(CASE WHEN c.status = 'Y' THEN c.deduction END) OVER (PARTITION BY c.recid) as deduction
FROM cost c INNER JOIN
cost_types ct
ON c.recid = ct.recid
WHERE c.cost_year = 2018;
为什么不直接使用 CASE
呢?:
SELECT recid, price, receive_date,
(CASE WHEN status = 'Y' THEN deduction END) AS deduction
FROM Cost c INNER JOIN
cost_types ct
ON c.recid = ct.recid
WHERE cost_year = 2018;
编辑:我怀疑你想要一些东西:
SELECT recid, price, receive_date, c1.deduction
FROM Cost c INNER JOIN
cost_types ct
ON c.recid = ct.recid OUTER APPLY
(SELECT TOP (1) c1.*
FROM Cost c1
WHERE c1.recid = c.recid AND c1.status = 'Y'
ORDER BY ?? -- Use ordering column based on you want deduction
) c1;
WHERE cost_year = 2018;