![](/img/trans.png)
[英]SQL - Select Columns from table where another table column value equals column name list
[英]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.