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代码中调用该过程。