在我们的数据模型中,有一个人。
一个人住在房子里。
一个人可以有一个“订阅”。 (与订阅的构成无关)
房屋可以有一个“订阅”。
订阅具有一个SubscriptionNumber。
因此,此数据模型允许一个人直接订阅,也可以通过其房屋订阅。
现在进行查询。
如果此人通过其房屋拥有订阅,则与该订阅相关联的SubscriptionNumber需要以结果结尾。如果不是这种情况,则与直接与Person相关的Subscription关联的SubscriptionNumber需要以结果结尾(如果不存在则为NULL)。
该查询的结果将显示在网格中。我们允许用户在此列上指定过滤和排序。这意味着两件事:
1) We cannot simply specify a CASE in the 'main' select statement and alias that result,
because this disallows us to filter on it, since WHERE is processed before SELECT.
2) For the filtering to be meaningful the result has to be 'put' in one alias
我真的是数据库开发的新手,完全陷入困境,但这是我到目前为止提出的:
1) Using a query like this:
SELECT
(CASE
WHEN (House of person has subscription)
THEN (return subscription number of house)
ELSE (return subscription number of person)
END) AS SubscriptionNumber
This leaves me with the exception regarding the unknown column when i try to apply ordering on SubscriptionNumber. Is there some way to avoid this?
2) Joining the 2 tables in the FROM list:
...
FROM People
JOIN (...) AS HouseSubscriptionNumber
JOIN (...) AS PersonSubscriptionNumber
This leaves me with 2 seperate columns, which also disallows my ordering.
从概念上讲,我正在寻找一种根据其存在来提取任一方法的方法。
我一直忙于子查询和联合以及各种各样的东西,但是我总是会遇到某种脑循环:-(例如,我可以写一些类似的东西:
FROM People
JOIN (
SELECT
SubscriptionNumber =
CASE ...
END)
但是我如何将其加入主查询?
很多问题!
有什么办法可以做到这一点?
最佳答案
在示例中,使用方法1的最简单方法是CROSS APPLY
。 CROSS APPLY
用FROM
子句处理,并且其中的任何别名都可以重用,就像普通表中的列名一样:
SELECT
...
CxA.SubscriptionNumber
FROM
MyTables
CROSS APPLY
(SELECT CASE
WHEN (House of person has subscription)
THEN (return subscription number of house)
ELSE (return subscription number of person)
END) CxA(SubscriptionNumber)
在示例中,
CxA
只是CROSS APPLY
表达式的别名(就像表别名一样,可以根据需要进行更改),而SubscriptionNumber是列别名。关于sql - 基于值存在的条件表联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22355705/