簡體   English   中英

當第二個表中沒有數據時,如何從第一個表中獲取表

[英]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.

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