簡體   English   中英

Select 值來自表名,其中表名存儲為使用動態 SQL 的其他表中的列中的值?

[英]Select value from a table name where table name is stored as a value in column in some other table using dynamic SQL?

我正在嘗試獲取NULL列值的值。 相應的值存儲在不同的表中。 此表名與我嘗試從中獲取的表位於同一個表中

ID  | ColumnName1 | ColumnName2 | ColumnNam3
____________________________________________
1      ABC           TableName1    RecordId1
2      PQR           TableName1    RecordID2
3      NULL          TableName1    RecordId3
4      NULL          TableName2    RecordId1
5      STU           TableName2    RecordId2

所以我的 select 查詢是

Select ColumnName1 from Table

結果是什么

ID  | ColumnName1 | ColumnName2 | ColumnNam3
    ____________________________________________
    1      ABC           TableName1    RecordId1
    2      PQR           TableName1    RecordID2
    3      NULL          TableName1    RecordId3
    4      NULL          TableName2    RecordId1
    5      STU           TableName2    RecordId2

是否有可能實現以下目標?

 Select 
       CASE WHEN ColumnName1 is NULL 
        then SELECT ColumnName1 From ColumnName2 Where RecordId = ColumnName3 
       ELSE COlumnName1 AS 
ColumnNullFilled END

哦,我已經嘗試過動態 sql 之類的

Declare @SqlQuery NVARCHAR(MAX)

SET @SqlQuery = N'Select  CASE WHEN ColumnName1 is NULL 
            then SELECT ColumnName1 From ColumnName2 Where RecordId = ColumnName3 
           ELSE COlumnName1 AS 
    ColumnNullFilled1 END 
  Case when ColumnNameSOmeother is NULL
    then SELECT ColumnNameSOmeother  From ColumnName2 Where RecordId = ColumnName3 
           ELSE ColumnNameSOmeother AS 
    ColumnNullFilled2 END  

...
ColumnNameN
FROM Table'

EXEC sp_executesql @SqlQuery;

它不執行,但只打印 columnname2 和 columnname3 而不是 columnvalues。

注意:我創建了一個 SP,它根據 columnname2 和 ColumnName2 作為參數獲取記錄,它給出了結果,但不適用於動態 SQL。

我還嘗試了用戶定義的 function,我不確定是否還有其他方法。 這里不僅有 3 條記錄,而且我說的是 1000 條記錄,如果 null,每條記錄在其他表中都有一個值。

抱歉,其他開發人員以前沒有進行規范化,我無法返回 go 並更改架構。 此外,如果我不僅針對一列執行此操作,而且針對不同的其他列執行相同的場景,應用程序也會變得過於繁重。 (列名X)。

假設我了解您的要求,您是否可以不只是將兩個表都進行外部連接,或者isnull表中的列都為空,或者用用case來確定要使用哪一列?

select IsNull(t1.columnName1, t2.columnName1) as Result
from MyTable t
left join Tablename1 t1 on t1.recordId=ColumnNam3
left join Tablename2 t2 on t2.recordId=ColumnNam3
where <criteria>

或者

select case ColumnName2
        when 'TableName1' then t1.ColumnName1 else t2.ColumnName1 end as Result
from MyTable t
left join Tablename1 t1 on t1.recordId=ColumnNam3
left join Tablename2 t2 on t2.recordId=ColumnNam3
where <criteria>

嘗試以下操作:

(我包含了創建一些測試數據的代碼,例如您的示例)

實際的語句生成在底部。

基本上,這會動態生成一個 SQL 語句,該語句在所有引用的表上進行左連接。 但是,請注意,如果左連接有很多並且表中有很多行,那么左連接會導致嚴重的性能問題。 在這種情況下,我建議重新考慮您的設計。 例如,將列 ColumnName2 & 3 拆分為幾列...

-- CREATE TEST DATA
create table [Table] (
    [ID] int not null,
    [ColumnName1] varchar(16) null,
    [ColumnName2] sysname not null,
    [ColumnName3] varchar(16) not null
);
go
create table [TableName1] (
    [ColumnName1] varchar(16) null,
    [RecordId] varchar(16) not null
);
go
create table [TableName2] (
    [ColumnName1] varchar(16) null,
    [RecordId] varchar(16) not null
);
go
insert into [Table] ( [ID], [ColumnName1], [ColumnName2], [ColumnName3] )
values
    ( 1, 'ABC', 'TableName1', 'RecordId1' ),
    ( 2, 'PQR', 'TableName1', 'RecordID2' ),
    ( 3, NULL,  'TableName1', 'RecordId3' ),
    ( 4, NULL,  'TableName2', 'RecordId1' ),
    ( 5, 'STU', 'TableName2', 'RecordId2' );
insert into [TableName1] ( [ColumnName1], [RecordId] )
values
    ( '111', 'RecordId1' ),
    ( '222', 'RecordID2' ),
    ( '333', 'RecordId3' );
insert into [TableName2] ( [ColumnName1], [RecordId] )
values
    ( 'one', 'RecordId1' ),
    ( 'two', 'RecordId2' );
go

-- ACTUAL CODE
declare @joinSql nvarchar(max) = N'';
select @joinSql = @joinSql+N'
left join ['+REPLACE([ColumnName2], N']', N'[]]')+N'] on
    [base].[ColumnName2] = N'''+REPLACE([ColumnName2], N'''', N'''''')+N''' and
    ['+REPLACE([ColumnName2], N']', N'[]]')+N'].[RecordId] = [base].[ColumnName3]'
from ( select distinct [ColumnName2] from [Table] ) as [distinct];

declare @caseSql nvarchar(max) = N'';
select @caseSql = @caseSql+N', ['+REPLACE([ColumnName2], N']', N'[]]')+N'].[ColumnName1]'
from ( select distinct [ColumnName2] from [Table] ) as [distinct];

declare @sql nvarchar(max);
set @sql = N'
select
    [base].[ID],
    COALESCE([base].[ColumnName1]'+@caseSql+N') [ColumnName1],
    [base].[ColumnName2],
    [base].[ColumnName3]
from [Table] as [base]'+@joinSql+N';';
print @sql;
exec sp_executesql @sql;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM