gpt4 book ai didi

sql - 基于多对多过滤器进行选择

转载 作者:行者123 更新时间:2023-12-04 23:48:11 26 4
gpt4 key购买 nike

晚上好

我有一个类似于下图的表格布局。 User 表存储了我的大部分信息。对于每个用户,我还可以有数量不确定的PreferenceLocation 选择,我将它们存储在联结表中,如图所示。

Data table layout

  1. 当管理员开始生成报告时,他们会像过滤器一样使用首选项和位置选择。例如,他们可以选择 Preference1 和 Preference3,以及 UserLocation2 和 UserLocation4,并且报告应该只显示至少具有一个偏好和至少一个位置的用户。是否可以在一个 SQL select 语句中执行此操作?我正在使用 SQL Server 2008 R2。

  2. 假设用户记录符合上述要求,有没有办法显示他们所有的偏好和位置,并连接到一个新列中。我已经想出如何为单个用户返回连接结果,但想知道它是否也可以作为同一 SQL select 语句的一部分来完成。

这就是我为单个 UserID 返回以逗号分隔的首选项...

DECLARE @concatlist VARCHAR(MAX)
SELECT @concatlist = COALESCE(@concatlist+', ', '') + dbo.Preference.Title
FROM dbo.UserPreference
LEFT OUTER JOIN dbo.Preference
ON dbo.UserPreference.PreferenceID = dbo.Preference.PreferenceID
WHERE dbo.UserPreference.UserID = 5
SELECT @concatlist as OutputColumn

任何指针都会很棒。我在这上面花了半天时间,虽然我可以部分做到,但找不到在一条语句中做到这一点的方法。

谢谢,

最佳答案

你可以试试这个

WITH UPreference AS (
SELECT u.*,p.*
FROM Users u
INNER JOIN UserPreference up
ON u.UserID = up.UserID
INNER JOIN Preference p
ON up.PreferenceID = p.PreferenceID
)
, ULocation AS (
SELECT u.*,l.*
FROM Users u
INNER JOIN UserLocation ul
ON u.UserID = ul.UserID
INNER JOIN Location l
ON l.LocationID = ul.LocationID
)
SELECT u.*
,AllPreferences = STUFF((SELECT ',' + up.Title FROM UPreference up WHERE up.UserID = u.UserID FOR XML PATH('')) ,1,1,'')
,AllLocations = STUFF((SELECT ',' + ul.[Name] FROM ULocation ul WHERE ul.UserID = u.UserID FOR XML PATH('')) ,1,1,'')
FROM Users u
WHERE
EXISTS(SELECT 1 FROM UPreference up WHERE up.UserID = u.UserID AND up.Title IN ('Preference1','Preference3')
AND
EXISTS(SELECT 1 FROM ULocation ul WHERE ul.UserID = u.UserID AND ul.[Name] IN ('Location2','Location4')

关于sql - 基于多对多过滤器进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19641703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com