[英]How to query data from a second table when the table's name is in first table's column data
[英]how to get table from first table when data is not there in second table
我有一個要求,當兩個ID相同時,我需要顯示兩個表的數據。當ID在第一個表中存在而第二個表中不存在時,我需要顯示第一個表中的數據
CREATE TABLE [dbo].[TEST](
[ID] [int] NULL,
[Name] [varchar](10) NULL,
[Status] [char](1) NULL,
[CreatedDate] [datetime] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Test_History](
[ID] [int] NULL,
[Name] [varchar](10) NULL,
[Status] [char](1) NULL,
[CreatedDate] [datetime] NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[Test_History] Script Date: 06/19/2015 19:01:49 ******/
INSERT [dbo].[Test_History] ([ID], [Name], [Status], [CreatedDate]) VALUES (1, N'Mohan', N'A', CAST(0x0000A4BC01347E88 AS DateTime))
INSERT [dbo].[Test_History] ([ID], [Name], [Status], [CreatedDate]) VALUES (1, N'Mohan', N'I', CAST(0x0000A4BC0134A390 AS DateTime))
INSERT [dbo].[Test_History] ([ID], [Name], [Status], [CreatedDate]) VALUES (2, N'Rohan', N'A', CAST(0x0000A4BC01391FCC AS DateTime))
/****** Object: Table [dbo].[TEST] Script Date: 06/19/2015 19:01:49 ******/
INSERT [dbo].[TEST] ([ID], [Name], [Status], [CreatedDate]) VALUES (2, N'Rohan', N'I', CAST(0x0000A4BC0138D584 AS DateTime))
INSERT [dbo].[TEST] ([ID], [Name], [Status], [CreatedDate]) VALUES (1, N'Mohan', N'A', CAST(0x0000A4BC013072DC AS DateTime))
INSERT [dbo].[TEST] ([ID], [Name], [Status], [CreatedDate]) VALUES (3, N'Raj', N'A', CAST(0x0000A4BC0138DED7 AS DateTime))
INSERT [dbo].[TEST] ([ID], [Name], [Status], [CreatedDate]) VALUES (4, N'Krishna', N'A', CAST(0x0000A4BC0138EE31 AS DateTime))
到目前為止,我已經嘗試過查詢以達到結果
select T.ID,COALESCE(T.ID,TT.ID),T.Name,COALESCE(T.Name,TT.Name),T.status,COALESCE(T.status,TT.status)
from Test T LEFT JOIN (Select TOP 1 ID,MIN(Name)name,Status from Test_History
GROUP BY ID,status
)TT
ON T.ID = TT.ID
where T.ID = 3
Id = 1 and 2 present show i will get data from both tables
Id = 3 and 4 not present in the table
so using coalesce i will get the data
從第一個表開始,並在第二個表列中顯示
但是還有其他方式像兩個表都是相同的結構嗎
我在想
Declare @tablename varchar(10)
IF EXISTS (SELECT 1 from TESt where id = @id)
IF COunt there in both tables
SET @tablename = Test
ELSE
SET @tablename = Test_history
select * from @tablename where id = @ID
我能得到這樣的解決方案嗎
第一:感謝您提供與問題相關的數據的出色設置!
如果您真正的問題是是否可以按照問題中的描述使用表變量,則答案為否; 或更准確地說,它不值得。
不推薦:
declare @TableName TABLE (
[ID] [int] NULL,
[Name] [varchar](10) NULL,
[Status] [char](1) NULL,
[CreatedDate] [datetime] NULL)
IF EXISTS (SELECT 1 from TESt where id = @id)
INSERT INTO @TableName SELECT * FROM dbo.TEST WHERE ID = @ID
ELSE INSERT INTO @TableName SELECT * FROM dbo.[Test_History] WHERE ID = @ID
select * from @tablename where id = @ID
這是我更喜歡的解決方案:
DECLARE @ID INT = 3;
SELECT * FROM [dbo].[TEST] ss WHERE ss.id = @id
UNION ALL SELECT * FROM [dbo].[Test_History] th WHERE th.id = @id
and not exists ( SELECT * FROM [dbo].[TEST] ss WHERE ss.id = @id);
UNION ALL
表現出奇地好-不要忘記ALL
關鍵字,我假設ID是PK或AK。
您可以使用EXCEPT
。
這是一個例子:
SELECT a,b
FROM (
VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)
) AS MyTable(a, b)
EXCEPT
SELECT a,b
FROM (
VALUES (1, 2), (7, 8), (9, 10)
) AS MyTable(a, b);
這將返回上一條語句的所有行,這些行不在第二條語句中。
如果我理解正確,並且您希望顯示兩個表之間匹配的所有記錄,並且當同一結果集中的第二個表中不存在該ID時,僅顯示第一個表中的記錄,那么您所需要做的就是簡單的左連接:
SELECT *
FROM dbo.test t
LEFT OUTER JOIN Test_History th
ON t.id = th.id
WHERE t.id = @id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.