Sql 选择字段与多个预定义值关联的行
我很难为这个问题选择一个题目。我不确定它准确地描述了我想要什么,因此如果您能帮助改进标题,而不是投反对票,我将不胜感激。:) 我有以下(示例)表格: 我想从Sql 选择字段与多个预定义值关联的行,sql,sql-server,Sql,Sql Server,我很难为这个问题选择一个题目。我不确定它准确地描述了我想要什么,因此如果您能帮助改进标题,而不是投反对票,我将不胜感激。:) 我有以下(示例)表格: 我想从URL中选择与USERS中至少两个id对应的所有URL。因此,对于eample,使用以下示例表查询的结果: +----------+ | url | +----------+ | a.com | <- associated with ids: 1, 3, 4 ------------ | e.com | <-
URL
中选择与USERS
中至少两个id对应的所有URL。因此,对于eample,使用以下示例表查询的结果:
+----------+
| url |
+----------+
| a.com | <- associated with ids: 1, 3, 4
------------
| e.com | <- associated with ids: 3, 4
+----------+
+----------+
|网址|
+----------+
|a.com |如果每个url的最小值不等于最大值,那么您将有多个id与url关联,我们可以通过执行内部联接来排除用户
表中没有的id
,所以可能是这样的情况
select url
from URLS as a
inner join USERS as b
on a.id=b.id
group by url
having max(b.id)<>min(b.id)
选择url
从URL作为
内部用户作为b连接
在a.id=b.id上
按url分组
具有最大(b.id)最小(b.id)
如果要在同一列中查看所有关联ID,可以使用STUFF()
。这是您的样品:
--DROP TABLE Users;
CREATE TABLE Users
(
id INT
);
--DROP TABLE Urls;
CREATE TABLE Urls
(
id INT
,Url VARCHAR(100)
);
INSERT INTO Users VALUES(1),(2),(3),(4)
INSERT INTO URLs VALUES
(1,'a.com')
,(1,'b.com')
,(1,'d.com')
,(2,'a.com')
,(2,'e.com')
,(3,'a.com')
,(3,'e.com')
,(3,'f.com')
,(3,'g.com')
,(4,'a.com')
,(4,'e.com')
SELECT *,
STUFF((SELECT distinct ',' + CAST(ID AS VARCHAR)
from URLs U2
WHERE U1.Url=U2.Url
AND EXISTS (SELECT 1 FROM Users US WHERE U2.id=US.id)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
FROM
(SELECT DISTINCT Url FROM Urls) U1
您可以使用EXISTS()
作为
SELECT Url
FROM Urls T
WHERE EXISTS(
SELECT 1
FROM Urls
WHERE ID != T.ID
AND
Url = T.Url
)
GROUP BY Url;
或
更新:
因为您需要加入用户
表
SELECT T1.Url
FROM Urls T1 INNER JOIN Users T2
ON T1.ID = T2.ID
WHERE EXISTS(
SELECT 1
FROM Urls
WHERE ID != T1.ID
AND
Url = T1.Url
)
GROUP BY T1.Url;
SELECT T1.Url
FROM Urls T1 INNER JOIN Urls T2
ON T1.ID != T2.ID
AND T1.Url = T2.Url
INNER JOIN Users U ON T1.ID = U.ID
GROUP BY T1.Url;
你可以使用STUFF()来满足你的需要。@ZekiGumus-你能详细说明一下吗?我现在正在准备一个示例,只需在表之间做一个内部联接,以限制用户中具有匹配ID的记录,然后按url分组,并且计数(1)>1。只要查找HAVING子句,它就会变得明显。因此,这不是一个免费的编码服务网站。你试过什么???发布您的查询。如果你还没有尝试过任何东西,那就开始工作吧。我想OP只是想要与多个用户关联的URL值。。。我认为他们甚至不关心用户是什么,只是有多个。我已经在内容中添加了EXISTS()。因此,现在它也与用户相关。谢谢。我试过你的解决办法。因此,我得到了所有的URL,而不仅仅是a.com
和e.com
@ZekiGumus。我敢肯定你误解了这个问题。@TabAlleman你是对的。无论如何,它已标记为重复。谢谢。我不确定这是否会比COUNT(DISTINCT id)>1更好或更差,但它会达到预期的结果。唯一需要额外考虑的是,如果URL中的ID列与用户之间没有约束,那么如果要忽略URL中没有匹配用户记录的记录,则需要加入。要填写问题的确切措辞,需要加入到用户
。问题询问“与用户中至少两个ID对应的URL”。您的代码可以返回与两个ID相对应的URL,即使它们根本不在用户中。@MattCremeens只有假设URL
中的所有ID也在用户中,这才是正确的,但在示例数据中并非如此。@TabAlleman这是一个有效点。我会编辑的。谢谢!但是在这个选择中,哪里有一个针对用户表的检查?好的@Sipo检查更新。谢谢。我得到了0个结果:(好吧,我不这么认为@Sipo你可以在那里查看演示。你是对的,我有一个配置问题。让我现在测试一下。
SELECT T1.Url
FROM Urls T1 JOIN Urls T2
ON T1.ID != T2.ID
AND T1.Url = T2.Url
GROUP BY T1.Url;
SELECT T1.Url
FROM Urls T1 INNER JOIN Users T2
ON T1.ID = T2.ID
WHERE EXISTS(
SELECT 1
FROM Urls
WHERE ID != T1.ID
AND
Url = T1.Url
)
GROUP BY T1.Url;
SELECT T1.Url
FROM Urls T1 INNER JOIN Urls T2
ON T1.ID != T2.ID
AND T1.Url = T2.Url
INNER JOIN Users U ON T1.ID = U.ID
GROUP BY T1.Url;