SQL SELECT来自两个表(友谊)语句

时间:2011-10-31 15:40:06

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

我创建了以下表格:

表#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用户选择所有新的LiveStreams,只有当该用户连接到另一方时才应为特定用户检索LiveStream(uc_IsPending = 0)

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

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

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

这有点像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)";

1 个答案:

答案 0 :(得分:0)

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

这种语法错了。你不能这样做。使用Union,或使用LINQ to SQL。

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