如何基于特定条件筛选SQL Server 2012的查询结果?
针对SQL Server 2012的查询筛选方案
我来帮你搞定这个筛选需求!先把你的基础查询和样本输出理清楚,再针对不同场景给出具体的修改方案:
首先,你的基础T-SQL查询语句是:
SELECT a.ResaID, b.CheckInDate, c.ProfileID FROM RSD a LEFT JOIN GSS b on b.ResaID = a.ResaID LEFT JOIN RS c on c.ResaID = a.ResaID LEFT JOIN Profile d on d.ProfileID = c.ProfileID
对应的样本输出整理成表格更清晰:
| ResaID | CheckInDate | ProfileID |
|---|---|---|
| 100 | 2018-03-10 | 450 |
| 101 | 2018-03-15 | 658 |
| 102 | 2018-03-15 | 658 |
| 103 | 2018-03-24 | 700 |
| 115 | 2018-06-11 | 700 |
| 127 | 2018-07-09 | 851 |
下面是几种常见筛选需求的实现方案,你可以直接套用或调整:
1. 单条件精准筛选(比如指定ProfileID)
如果只想获取ProfileID = 700的记录,直接在查询末尾加WHERE子句:
SELECT a.ResaID, b.CheckInDate, c.ProfileID FROM RSD a LEFT JOIN GSS b on b.ResaID = a.ResaID LEFT JOIN RS c on c.ResaID = a.ResaID LEFT JOIN Profile d on d.ProfileID = c.ProfileID WHERE c.ProfileID = 700;
注意:如果要保留RSD表中所有记录(哪怕没有匹配的RS记录),仅让匹配的RS记录满足条件,就得把条件移到
LEFT JOIN RS c的ON子句里,写成LEFT JOIN RS c on c.ResaID = a.ResaID AND c.ProfileID = 700,避免左连接变成内连接的效果。
2. 日期范围筛选(比如2018年3月的入住记录)
要筛选CheckInDate在2018年3月的记录:
SELECT a.ResaID, b.CheckInDate, c.ProfileID FROM RSD a LEFT JOIN GSS b on b.ResaID = a.ResaID LEFT JOIN RS c on c.ResaID = a.ResaID LEFT JOIN Profile d on d.ProfileID = c.ProfileID WHERE b.CheckInDate BETWEEN '2018-03-01' AND '2018-03-31';
如果想保留RSD中没有对应GSS记录的条目,要把条件改成
WHERE (b.CheckInDate BETWEEN '2018-03-01' AND '2018-03-31') OR b.CheckInDate IS NULL;,不然会过滤掉无匹配的记录。
3. 多条件组合筛选(比如ProfileID=658且入住日期是2018-03-15)
用AND/OR组合多个条件即可:
SELECT a.ResaID, b.CheckInDate, c.ProfileID FROM RSD a LEFT JOIN GSS b on b.ResaID = a.ResaID LEFT JOIN RS c on c.ResaID = a.ResaID LEFT JOIN Profile d on d.ProfileID = c.ProfileID WHERE c.ProfileID = 658 AND b.CheckInDate = '2018-03-15';
4. 筛选重复出现的ProfileID记录
如果想找出同一个ProfileID出现多次的记录(比如示例中的658、700),可以用SQL Server 2012支持的窗口函数:
WITH ProfileCounts AS ( SELECT a.ResaID, b.CheckInDate, c.ProfileID, COUNT(*) OVER (PARTITION BY c.ProfileID) AS ProfileOccurrences FROM RSD a LEFT JOIN GSS b on b.ResaID = a.ResaID LEFT JOIN RS c on c.ResaID = a.ResaID LEFT JOIN Profile d on d.ProfileID = c.ProfileID ) SELECT ResaID, CheckInDate, ProfileID FROM ProfileCounts WHERE ProfileOccurrences > 1;
如果你的筛选需求是其他特定条件,可以直接把具体规则告诉我,我再帮你调整查询语句!
内容的提问来源于stack exchange,提问作者user3115933
相关产品推荐
相关产品推荐

