簡體   English   中英

如何從多個表中選擇數據,其中表名是另一個表的列中的值?

[英]How to select data from multiple tables where table name is value from a column of another table?

我有一個由表名組成的表,例如:

表A

    UID  TableName  CifKey  ...
    1     xxx       12345
    1     yyy       12345
    1     xxx       12345
    2     zzz       45678

如何從名稱與表A中的TableName列相同的表中選擇數據?

例如:

SELECT A.a, B.b 
FROM TableA A 
JOIN ' + @TableName + ' B ON A.Cifkey = B.Cifkey 
WHERE A.uid = @uid AND A.cifkey = @cifkey

謝謝!

如果您的聯接有效,則動態sql是您想要完成任務的方式。

declare @tablename nvarchar(100)
select @tablename=tablename from yourtable where uid=@uid and cifkey=@cifkey

declare @sqlquery nvarchar(4000)
set @sqlquery='SELECT A.a, B.b FROM TableA A 
JOIN ' + @TableName + ' B 
ON A.Cifkey = B.Cifkey 
WHERE A.uid = @uid and A.cifkey = @cifkey';

exec sp_executesql @sqlquery,
N'@uid int,@cifkey int',
@uid=10,@cifkey=100

你將不得不使用dyanmic查詢 - 像這樣

DECLARE @tablename VARCHAR(50)
DECLARE @uid INT = 1
DECLARE @cifkey INT = 12345
SELECT @tablename = TableName FROM TableA WHERE uid = @uid AND cifkey = @cifkey

DECLARE @query VARCHAR(500)

SELECT @query = 'select A.a, B.b from TableA A JOIN ' + @tablename + ' B 
ON A.Cifkey = B.Cifkey 
WHERE A.uid = ' + CONVERT(VARCHAR(20),@uid) + ' and A.cifkey = ' + CONVERT(VARCHAR(20), @cifkey)

EXEC(@query)

動態SQL是必經之路:

DECLARE @uid    INT = 1,
        @cifkey INT = 12345

DECLARE @sql NVARCHAR(MAX) = ''

SELECT @sql = @sql +
'SELECT
    A.a, B.b -- Replace with correct column names
FROM TableA A
JOIN ' + QUOTENAME(TableName) + ' B
    ON A.Cifkey = B.Cifkey
WHERE
    A.uid = @uid 
    AND A.cifkey = @cifkey
UNION ALL
'
FROM (
    SELECT DISTINCT TableName FROM TableA WHERE UID = @uid AND cifkey = @cifkey
) t

IF @sql <> '' BEGIN
    -- Remove the last UNION ALL
    SELECT @sql = LEFT(@sql, LEN(@sql) - 11)

    PRINT @sql

    EXEC sp_executesql
        @sql,
        N'@uid INT, @cifkey INT',
        @uid,
        @cifkey
END

簡而言之,不,不是你所要求的。 但是,您可以在此答案中使用動態SQL來創建一系列SELECT語句,這些語句可以與UNION合並以生成所需的結果,如下所示:

SELECT DISTINCT 'SELECT A.a, B.b FROM TableA A 
        JOIN ' + TableName + ' B 
        ON A.Cifkey = B.Cifkey 
        WHERE A.uid = @uid and A.cifkey = @cifkey
        UNION
        '
FROM TableA

只需將結果復制到SQL編輯器中,從最后一項中刪除UNION ,然后運行整個過程以獲得結果。

我不得不說......這有點瘋狂

注意:我向TableA添加了一個ID列作為主鍵。 這是唯一標識行以使用相同的UID和Cifkey區分多個行所必需的

-- Create the table
create table TableA
(
    ID      int identity,
    UID     int,
    TableName   varchar(5),
    CifKey      int,
    a       int
)

create table xxx
(
    CifKey      int,
    b       int
)

create table yyy
(
    CifKey      int,
    b       int
)

create table zzz
(
    CifKey      int,
    b       int
)

set nocount on

-- Insert some sample data
insert into TableA select 1, 'xxx', 12345, 1
insert into TableA select 1, 'yyy', 12345, 2
insert into TableA select 1, 'xxx', 12345, 3
insert into TableA select 2, 'zzz', 45678, 4

insert into xxx select 12345, 100
insert into yyy select 12345, 200
insert into zzz select 45678, 300

-- the Dynamic SQL query
declare @sql    nvarchar(max)

select  @sql    = N'SELECT A.a, b = COALESCE('

select  @sql    = @sql +
        + N'B' + convert(varchar(10), ID) + '.b,'
from    TableA
order by ID

select  @sql    = left(@sql, LEN(@sql) - 1) + ')' + char(13)

select  @sql    = @sql 
        + N'FROM TableA A'  + char(13)

; with cte as
(
    select  *, rn = convert(varchar(10), ID)
    from    TableA
)
select  @sql    = @sql 
        + N'LEFT JOIN ' + quotename(TableName) + ' AS B' + rn + ' ' + char(13)
        + N'ON  A.CifKey    = B' + rn + '.CifKey' + char(13)
        + N'AND A.ID        = ' + rn + char(13)
from    cte

print   @sql 
exec    sp_executesql @sql

set nocount off

-- clean up 
drop table TableA
drop table xxx
drop table yyy
drop table zzz

-- The generated Query (print @sql)
SELECT A.a, b = COALESCE(B1.b,B2.b,B3.b,B4.b)
FROM TableA A
LEFT JOIN [xxx] AS B1 
ON  A.CifKey    = B1.CifKey
AND A.ID        = 1
LEFT JOIN [yyy] AS B2 
ON  A.CifKey    = B2.CifKey
AND A.ID        = 2
LEFT JOIN [xxx] AS B3 
ON  A.CifKey    = B3.CifKey
AND A.ID        = 3
LEFT JOIN [zzz] AS B4 
ON  A.CifKey    = B4.CifKey
AND A.ID        = 4

暫無
暫無

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

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