【问题标题】:SQL SELECT From two tables (friendship) statementSQL SELECT From两个表(友谊)语句
【发布时间】:2011-10-31 15:40:05
【问题描述】:

我创建了以下表格:

表 #1:tbl_Connections

USE [taaraf_db]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tbl_Connections](
    [uc_Id] [int] IDENTITY(1,1) NOT NULL,
    [uc_User] [nvarchar](50) NOT NULL,
    [uc_Connection] [nvarchar](50) NOT NULL,
    [uc_IsPending] [int] NOT NULL,
    [uc_DateTime] [datetime] NOT NULL,
 CONSTRAINT [PK_tbl_Connections] PRIMARY KEY CLUSTERED 
(
    [uc_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[tbl_Connections] ADD  CONSTRAINT [DF_tbl_Connections_uc_IsPending]  DEFAULT ((1)) FOR [uc_IsPending]
GO

表 #2:tbl_LiveStream

USE [taaraf_db]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tbl_LiveStreams](
    [ls_Id] [int] IDENTITY(1,1) NOT NULL,
    [ls_Story] [nvarchar](max) NOT NULL,
    [ls_User] [nvarchar](50) NOT NULL,
    [ls_Connection] [nvarchar](50) NOT NULL,
    [ls_DateTime] [datetime] NOT NULL,
 CONSTRAINT [PK_tbl_LiveStreams] PRIMARY KEY CLUSTERED 
(
    [ls_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

现在tbl_Connections中的uc_User代表发起好友请求的用户,而uc_Connection 代表对方。 第二个表(tbl_LiveStreams)应用相同的概念

我正在尝试为 cetrain 用户选择所有新的 LiveStream,只有当该用户连接到另一方时,才应为特定用户检索 LiveStream (uc_IsPending = 0)

我有一个 C# 函数,它接受以下参数:

public static DataTable GetAsyncLiveStream(string CurrentUser, int startAt, int howMany) { ... }

如果满足上述要求,DataTable 应该为给定的 CurrentUser (ls_User) 返回 LiveStream 中的所有新项目。

这有点像 Facebook 新闻提要、朋友的动态等等…… 哦,是的,只要有人 (ls_User) 向 (ls_Connection) 发起某种特定事件,就会填充 tbl_LiveStream。

我不确定我是否在这里让我的生活变得复杂,但这就是我所拥有的,所有的帮助都是值得感谢的。

我应该提到,我已经通过循环从 tbl_LiveStream 返回的所有记录并使用自定义类函数 .IsFriends() 进行了一些验证,该函数将检查数据库中的友谊状态并以编程方式填充 DataTable。 ..这有点愚蠢,我承认。但我不知道该怎么做。

最后一件事, 我正在使用以下查询来返回有限的结果:

SELECT * FROM (
SELECT row_number() OVER (ORDER BY ) AS rownum, ls_Id
FROM )
AS A
WHERE A.rownum BETWEEN (@start) AND (@start + @rowsperpage) 

请帮助并感谢您的宝贵时间。

编辑 我想指出,这就是我从 tbl_Connections 表中获取谁是谁的朋友的方式。

    const string sql = "SELECT REPLACE((uc_Connection + uc_User), @CurrentUser, '') AS Connection " +
                       "FROM tbl_Connections Connection " +
                       "WHERE (@CurrentUser = uc_Connection) OR (@CurrentUser = uc_User)";

【问题讨论】:

  • 您应该为此定义一个视图,您的row_number() 包装查询使用该视图。到目前为止你有什么?
  • 我有我在上面发布的内容......现在就是这样。我真的不知道如何开始。
  • 你能修改数据库吗?你的实际需求是什么(如果你有两个不同的表,[有效地] exact 相同的结构,你可能有一个表要拉出来)?如果您还没有(SQL 注入),您应该使用准备好的语句,而不是连接的字符串。表名应以tbl为前缀(如果everything都以前缀),列不应以缩短的表名作为前缀(混淆,仅选择时毫无意义从一个表中选择,并且无论如何在从多个表中选择时都希望使用别名)。

标签: c# asp.net sql sql-server


【解决方案1】:
SELECT * FROM (
SELECT row_number() OVER (ORDER BY ) AS rownum, ls_Id
FROM )
AS A
WHERE A.rownum BETWEEN (@start) AND (@start + @rowsperpage) 

这个语法是错误的。你不能那样做。使用联合,或使用 LINQ to SQL。

从批评的角度来看,不要获取数据表,而要获取实体。您似乎在这里过于复杂了,使用您可能不熟悉的技术。我建议获取所有当前存在的数据并将其转储到 CSV 文件中,然后使用类似 Sharp Architecture 的内容从头开始应用程序,它可以为您抽象出其中的一些细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多