Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
C# 嵌套查询的帮助!_C#_Sql Server_Tsql - Fatal编程技术网

C# 嵌套查询的帮助!

C# 嵌套查询的帮助!,c#,sql-server,tsql,C#,Sql Server,Tsql,链被认为是用户的朋友。 有人知道如何使用连接执行此查询吗!?非常感谢 首先,尝试摆脱使用string.Format将参数值推送到SQL查询中。这是一个巨大的安全问题 请回答您的问题。我必须承认,我对字符串连接有点迷茫:-P,但如果我是对的,您希望获得事件和一些用户信息。据我所知,SenderId和ReciverId已经是你的ID了。如果是这样,您可以将第一个SELECT并提供id作为参数直接删除到第二个SQL语句中,如下所示,仅SQL: 编辑:Tom向我展示了缺失的零件状态=Ok 选择前20名

链被认为是用户的朋友。
有人知道如何使用连接执行此查询吗!?非常感谢

首先,尝试摆脱使用string.Format将参数值推送到SQL查询中。这是一个巨大的安全问题

请回答您的问题。我必须承认,我对字符串连接有点迷茫:-P,但如果我是对的,您希望获得事件和一些用户信息。据我所知,SenderId和ReciverId已经是你的ID了。如果是这样,您可以将第一个SELECT并提供id作为参数直接删除到第二个SQL语句中,如下所示,仅SQL:

编辑:Tom向我展示了缺失的零件状态=Ok

选择前20名 a* ,b.作为发件人的用户名 ,c.作为接收者的用户名 ,b.作为发送者的化身 从事件a a.SenderId=b.Id上的内部加入用户b a.ReceiverId=c.Id上的内部联接用户c 哪里 a、 SenderId=@id 或者a.ReceiverId=@id; 更正版本:

        int id = 1;
        string chain = "(";
        SqlDataReader dr = SqlHelper.ExecuteReader(string.Format("SELECT a.Id as x, c.Id as y From Friends b INNER JOIN Users a ON b.SenderId = a.Id INNER JOIN Users c ON b.ReceiverId = c.Id WHERE (c.Id = {0} OR a.Id = {0}) AND State = '{1}'", id, "ok"));
        if (dr.HasRows)
            while (dr.Read())
                if (id == int.Parse(dr["y"].ToString()))
                    chain += dr["x"].ToString() + ", ";
                else
                    chain += dr["y"].ToString() + ", ";
        if (chain.Length > 1)
            chain = chain.Substring(0, chain.Length - 2) + ")";
        else
            chain = "(0)";
        // Chain has for example  => (2, 3, 4, 5) => which are the Ids for Users's Friends 
        string str = "SELECT TOP 20 a.*, b.UserName as Sender, c.UserName as Receiver, b.Avatar as SenderPic";
        str += " FROM Events a INNER JOIN Users b ON a.SenderId = b.Id INNER JOIN Users c ON a.ReceiverId = c.Id ";
        str += "WHERE SenderId IN ";
        str += chain;
        str += " OR ReceiverId IN";
        str += chain;
        str += " Order BY Id desc";
        dr = SqlHelper.ExecuteReader(str);

首先,尝试摆脱使用string.Format将参数值推送到SQL查询中。这是一个巨大的安全问题

请回答您的问题。我必须承认,我对字符串连接有点迷茫:-P,但如果我是对的,您希望获得事件和一些用户信息。据我所知,SenderId和ReciverId已经是你的ID了。如果是这样,您可以将第一个SELECT并提供id作为参数直接删除到第二个SQL语句中,如下所示,仅SQL:

编辑:Tom向我展示了缺失的零件状态=Ok

选择前20名 a* ,b.作为发件人的用户名 ,c.作为接收者的用户名 ,b.作为发送者的化身 从事件a a.SenderId=b.Id上的内部加入用户b a.ReceiverId=c.Id上的内部联接用户c 哪里 a、 SenderId=@id 或者a.ReceiverId=@id; 更正版本:

        int id = 1;
        string chain = "(";
        SqlDataReader dr = SqlHelper.ExecuteReader(string.Format("SELECT a.Id as x, c.Id as y From Friends b INNER JOIN Users a ON b.SenderId = a.Id INNER JOIN Users c ON b.ReceiverId = c.Id WHERE (c.Id = {0} OR a.Id = {0}) AND State = '{1}'", id, "ok"));
        if (dr.HasRows)
            while (dr.Read())
                if (id == int.Parse(dr["y"].ToString()))
                    chain += dr["x"].ToString() + ", ";
                else
                    chain += dr["y"].ToString() + ", ";
        if (chain.Length > 1)
            chain = chain.Substring(0, chain.Length - 2) + ")";
        else
            chain = "(0)";
        // Chain has for example  => (2, 3, 4, 5) => which are the Ids for Users's Friends 
        string str = "SELECT TOP 20 a.*, b.UserName as Sender, c.UserName as Receiver, b.Avatar as SenderPic";
        str += " FROM Events a INNER JOIN Users b ON a.SenderId = b.Id INNER JOIN Users c ON a.ReceiverId = c.Id ";
        str += "WHERE SenderId IN ";
        str += chain;
        str += " OR ReceiverId IN";
        str += chain;
        str += " Order BY Id desc";
        dr = SqlHelper.ExecuteReader(str);

我认为这可能会有帮助:

; WITH OkUsers AS (
   SELECT
      u.*
   FROM Users u
      JOIN Friends f ON u.Id = f.SenderId OR u.Id = f.RecipientId
   WHERE
      f.Status = 'Ok'
)
SELECT TOP(20)
   a.*
   ,b.UserName as Sender
   ,c.UserName as Receiver
   ,b.Avatar as SenderPic
FROM Events a 
   INNER JOIN OkUsers b ON a.SenderId = b.Id 
   INNER JOIN OkUsers c ON a.ReceiverId = c.Id 
WHERE
   a.SenderId = @id
   OR a.ReceiverId = @id;

临时表可以处理非常大的数据量。否则,您可以使用内存表。

我认为这可能会有帮助:

; WITH OkUsers AS (
   SELECT
      u.*
   FROM Users u
      JOIN Friends f ON u.Id = f.SenderId OR u.Id = f.RecipientId
   WHERE
      f.Status = 'Ok'
)
SELECT TOP(20)
   a.*
   ,b.UserName as Sender
   ,c.UserName as Receiver
   ,b.Avatar as SenderPic
FROM Events a 
   INNER JOIN OkUsers b ON a.SenderId = b.Id 
   INNER JOIN OkUsers c ON a.ReceiverId = c.Id 
WHERE
   a.SenderId = @id
   OR a.ReceiverId = @id;
--step[1]
SELECT DISTINCT CASE
WHEN a.Id = 1 THEN c.ID
WHEN c.Id = 1 THEN a.Id
ELSE
0 
END AS ID
INTO #OkUsers
From Friends b INNER JOIN Users a 
ON b.SenderId = a.Id INNER JOIN Users c 
ON b.ReceiverId = c.Id 
WHERE (c.Id = @id OR a.Id = @id) AND State = 'Ok';

--step[2]
SELECT TOP 20 a.*, b.UserName as Sender, c.UserName as Receiver, b.Avatar as SenderPic
FROM Events a INNER JOIN Users b ON a.SenderId = b.Id INNER JOIN Users c ON a.ReceiverId = c.Id
INNER JOIN #OkUsers ON #OkUsers.ID = SenderId OR #OkUsers.ID = ReceiverId
EXCEPT
SELECT TOP 20 a.*, b.UserName as Sender, c.UserName as Receiver, b.Avatar as SenderPic
FROM Events a INNER JOIN Users b ON a.SenderId = b.Id INNER JOIN Users c ON a.ReceiverId = c.Id
--INNER JOIN #OkUsers ON #OkUsers.ID = SenderId OR #OkUsers.ID = ReceiverId
WHERE SenderId IN (SELECT ID FROM #OkUsers) 
    OR ReceiverId IN(SELECT ID FROM #OkUsers);

DROP TABLE #OkUsers;


临时表可以处理非常大的数据量。否则,您可以使用内存表。

我认为您应该删除C代码,并将问题重新表述为涉及的SQL。包括有关架构的更多信息。这可能会让你得到更多的答案。很难弄清楚你真正感兴趣的是什么。发布的代码示例非常混乱,很难理解。如果您想知道如何使用SenderId在何处打开SQL查询。。。。到一个带有连接的查询中,那么请只给我们那个SQL查询,而不是生成它的C代码。。。。。。。你让人们回答你变得不必要的困难和困难……是否打算让在第一个查询中匹配的ReceiverId有资格在第二个查询中匹配SenderId?我只是想根据用户的朋友从表事件中获取用户的事件。。例如,如果用户1有20个朋友,我应该为他们所有人参加活动。但最大的问题是,我不知道好友Id在表事件中保存为SenderId还是ReceiverId,因此我构建了第一个查询,以便让用户的好友在第二个查询中使用它,其中的子句in=>where SenderId在用户的好友中还是ReceiverId在用户的好友中??我认为您应该删除C代码,并将问题重新表述为涉及的SQL。包括有关架构的更多信息。这可能会让你得到更多的答案。很难弄清楚你真正感兴趣的是什么。发布的代码示例非常混乱,很难理解。如果您想知道如何使用SenderId在何处打开SQL查询。。。。到一个带有连接的查询中,那么请只给我们那个SQL查询,而不是生成它的C代码。。。。。。。你让人们回答你变得不必要的困难和困难……是否打算让在第一个查询中匹配的ReceiverId有资格在第二个查询中匹配SenderId?我只是想根据用户的朋友从表事件中获取用户的事件。。例如,如果用户1有20个朋友,我应该为他们所有人参加活动。但最大的问题是,我不知道好友Id在表事件中保存为SenderId还是ReceiverId,因此我构建了第一个查询,以便让用户的好友在第二个查询中使用它,其中的子句in=>where SenderId在用户的好友中还是ReceiverId在用户的好友中+1绝对-将这样的SQL命令连接在一起是一个巨大的SQL注入漏洞,等待被利用!我认为原始版本在Friends上有一个额外的WHERE子句。State='ok'假设State列是在Friends上定义的table@Tom卡弗:谢谢你的提示。我更新了SQL语句。我没有在SenderId=@Id或ReceiverId=@Id中使用它的特定Id,而是有一个用户Id,我可以使用它从表friends中获取他的朋友,因此我在中使用了。。有什么建议吗!?!如果你只做一个陈述,你不需要回答你的问题。使用DBP参数
--step[1]
SELECT DISTINCT CASE
WHEN a.Id = 1 THEN c.ID
WHEN c.Id = 1 THEN a.Id
ELSE
0 
END AS ID
INTO #OkUsers
From Friends b INNER JOIN Users a 
ON b.SenderId = a.Id INNER JOIN Users c 
ON b.ReceiverId = c.Id 
WHERE (c.Id = @id OR a.Id = @id) AND State = 'Ok';

--step[2]
SELECT TOP 20 a.*, b.UserName as Sender, c.UserName as Receiver, b.Avatar as SenderPic
FROM Events a INNER JOIN Users b ON a.SenderId = b.Id INNER JOIN Users c ON a.ReceiverId = c.Id
INNER JOIN #OkUsers ON #OkUsers.ID = SenderId OR #OkUsers.ID = ReceiverId
EXCEPT
SELECT TOP 20 a.*, b.UserName as Sender, c.UserName as Receiver, b.Avatar as SenderPic
FROM Events a INNER JOIN Users b ON a.SenderId = b.Id INNER JOIN Users c ON a.ReceiverId = c.Id
--INNER JOIN #OkUsers ON #OkUsers.ID = SenderId OR #OkUsers.ID = ReceiverId
WHERE SenderId IN (SELECT ID FROM #OkUsers) 
    OR ReceiverId IN(SELECT ID FROM #OkUsers);

DROP TABLE #OkUsers;


从id变量中提供@id值。+1绝对-将这样的SQL命令连接在一起是一个巨大的SQL注入漏洞,等待利用!我认为原始版本在Friends上有一个额外的WHERE子句。State='ok'假设State列是在Friends上定义的table@Tom卡弗:谢谢你的提示。我更新了SQL语句。我没有在SenderId=@Id或ReceiverId=@Id中使用它的特定Id,而是有一个用户Id,我可以使用它从表friends中获取他的朋友,因此我在中使用了。。有什么建议吗!?!如果你只做一个陈述,你不需要回答你的问题。使用DbParameter从id变量中提供@id值。我如何在代码中使用它!此外,我还提取了一个成员的所有好友的所有标识号,然后将其放入字符串类型的变量中,以便在第二个查询中与in子句一起使用。。这是一个好方法还是什么!?任何只需一次数据库访问就能得到最终结果的sql代码都比两次往返的sql代码要好。此外,将数据从sql server存储到内存中并使用它比使用sql server进行所有操作的性能更好,但这不是一个始终有效的规则,因为它取决于数据量、应用程序服务器容量和用户负载……etcI甚至无法思考如何将其写入一条sql语句中!!!OkUsers=>SELECT=>DROP您可以创建一个存储过程并将此代码放入其中,然后从您的C代码中调用该过程。我如何在代码中使用它!此外,我还提取了一个成员的所有好友的所有标识号,然后将其放入字符串类型的变量中,以便在第二个查询中与in子句一起使用。。这是一个好方法还是什么!?任何只需一次数据库访问就能得到最终结果的sql代码都比两次往返的sql代码要好。此外,将数据从sql server存储到内存中并使用它比使用sql server进行所有操作的性能更好,但这不是一个始终有效的规则,因为它取决于数据量、应用程序服务器容量和用户负载……etcI甚至无法思考如何将其写入一条sql语句中!!!OkUsers=>SELECT=>DROP您可以创建一个存储过程并将此代码放入其中,然后从C代码中调用该过程。