Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择字段与多个预定义值关联的行_Sql_Sql Server - Fatal编程技术网

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;