从多个表

时间:2017-12-16 22:51:28

标签: c# visual-studio-2017 sql-server-2017

我有14张不同类型员工的表。我有一个连接到我的SQL Server数据库的C#应用​​程序,当我在文本框中键入姓氏时,它会带回一个带有该姓氏的记录并将其显示在列表框中。

但是我只用一张桌子设法做到了这一点。因此,如果我输入“琼斯”,它将从一张桌子中带回并显示琼斯。

我想从所有14张桌子中带回所有琼斯。换句话说,当我输入姓氏时,我需要应用程序向我显示所有14个表中姓氏的所有记录。

对此有什么合理的解决方法?如果我有一张包含所有员工的桌子,但我需要分离,这会容易得多。基本上,当我单击搜索按钮时,我需要从具有给定名称的14个表中的任何一个中获取应用程序。

对此有什么合适的方法?

4 个答案:

答案 0 :(得分:0)

您应该重复Code 14 Times以从所有这些表中收集值,或者您在一个Statement中一次为所有14个表提交SQL查询或14个查询 - 具体取决于您的数据访问技术......

答案 1 :(得分:0)

好的,要从所有14个表中获取结果,您可以使用UNION ALL运算符,因此您的SQL看起来像:

(SELECT first_name, last_name FROM table1 WHERE first_name='John')
 UNION ALL
(SELECT first_name, last_name FROM table2 WHERE first_name='John')
...
(SELECT first_name, last_name FROM table14 WHERE first_name='John')

每次选择都需要有相同数量的字段。但是,如果将所有名称(和任何其他共享数据)保存在一个表中,并使用具有不同数据集的所有14个表连接Key,则更好的方法。这样你可以防止像上面这样的长查询(可能是慢查询)和查询看起来更像这样:

SELECT first_name, last_name, user_type, user_id  WHERE first_name='John'

然后你可以从相应的表中检索字段,因为字段user_type为您提供信息,其中14个表中的哪个表用于搜索其他数据,user_id为您提供该用户的数据,因此第二个查询看起来像这样:

SELECT job_position, worksheet, other_data FROM tableN WHERE user_id=...

答案 2 :(得分:0)

在数据库中定义以下存储过程:

CREATE PROCEDURE GetAll_SP
(
    @FirstName VARCHAR(50)
)  
AS
    BEGIN
        (SELECT 1, first_name, last_name FROM UsersTable1 WHERE first_name = @FirstName)
        UNION
        (SELECT 2, first_name, last_name FROM UsersTable2 WHERE first_name = @FirstName)
        UNION
        (SELECT 3, first_name, last_name FROM UsersTable3 WHERE first_name = @FirstName)
        -- ....
    END

GO

或以下代码而不是您不需要对您的用户位置进行任何控制:

CREATE PROCEDURE GetAll_SP
(
    @FirstName VARCHAR(50)
)  
AS
    BEGIN
        (SELECT first_name, last_name FROM UsersTable1 WHERE first_name = @FirstName)
        UNION ALL
        (SELECT first_name, last_name FROM UsersTable2 WHERE first_name = @FirstName)
        UNION ALL
        (SELECT first_name, last_name FROM UsersTable3 WHERE first_name = @FirstName)
        -- ....
    END

GO

然后,在您的代码中:

String firstName = "Jones";

using (SqlCommand cmd = new SqlCommand("GetAll_SP", m_Connection))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = firstName;

    m_Connection.Open();
    cmd.ExecuteNonQuery();
}

答案 3 :(得分:0)

只需设置@SearchStr即可搜索每个表中的每一列。

drop table #results
go

declare @SearchStr nvarchar(100)
set @SearchStr = 'Donna%' -- use wildcards

CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL
BEGIN
    SET @ColumnName = ''
    SET @TableName = 
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM    INFORMATION_SCHEMA.TABLES
        WHERE       TABLE_TYPE = 'BASE TABLE'
            AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
    BEGIN
        SET @ColumnName =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM    INFORMATION_SCHEMA.COLUMNS
            WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND TABLE_NAME  = PARSENAME(@TableName, 1)
                AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'text')
                AND QUOTENAME(COLUMN_NAME) > @ColumnName
        )

    print cast(@TableName as nvarchar(200)) + ' ' + @ColumnName

    IF @ColumnName IS NOT NULL
        BEGIN
            INSERT INTO #Results
            EXEC
            (
                --'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
                --FROM ' + @TableName + ' (NOLOCK) ' +
                --' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2

                'SELECT ''' + @TableName + '.' + @ColumnName + ''', ' + @ColumnName + ' 
                FROM ' + @TableName + ' (NOLOCK) ' +
                ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
            )
        END
    END 
END

SELECT ColumnName, ColumnValue FROM #Results