PDA

View Full Version : مشکل در انتخاب رکوردها از 2 جدول



javadsaberifar
یک شنبه 05 آبان 1392, 14:41 عصر
با سلام به دوستان محترم
من یه مشکلی در نمایش لیست رکوردها دارم
فرض کنید 2 تا جدول a و b داریم که جدول b نقش آرشیو را دارد و رکورد های جدول a توسط یک Job که در سطح SQL Server است و هر 5 دقیقه Start می شود به جدول b منتقل می شوند.
فیلدهای این 2 جدول مشابه هم هستند.
فیلد ID هر 2 جدول Primary Key است و Auto Increment هستند. به همین خاطر رکوردها وقتی به جدول b منتقل می شوند ID جدید میگیرند.
مقدار ID در جدول b بسیار بزرگتر از مقدار ID در جدول a است.مثلا آخرین مقدار ID در جدول a عدد 1000 است و در جدول b مقدار 450000 است.
چون جدول b جدول آرشیو است و بزرگ می باشد این جدول پارتیشن بندی شده است و برای اینکه ما همیشه مثلا 100000 رکورد آخر را بدست بیاوریم از یک جدول واسط به نام AccountStatistics_GetPartitionNumberList استفاده می کنیم که من وارد جزئیات آن نمی شوم ولی خدمتتان عرض کنم که ما باید در Query های خود پارتیشن های مورد نیاز برای جستجو را مشخص کنیم.
یک View ایجاد شده است تا رکوردهای این 2 جدول را نمایش دهد. حالا من نیاز به یک Query از این View دارم که باید شرایط زیر را داشته باشد:
1- اولویت انتخاب رکوردها با جدول a است.
2- رکوردها بر اساس ID باید بصورت نزولی نمایش داده شود.
باتوجه به مورد شماره 2 ما در View مقدار ID جدول a را با یک عدد بزرگ جمع می کنیم که اولویت آن ها بالاتر برود اما همانطور که بالاتر خدمتتان عرض کردم ما باید Partition ID ها را مشخص کنیم و این شرط باعث می شود که رکوردهای جدول a نمایش داده نشود.
2 جدول a و b :

CREATE TABLE [dbo].[a](
[ID] [int] IDENTITY(1000,1) NOT NULL,
[AccountID] [int] NOT NULL,
[Date] [datetime] NOT NULL,
CONSTRAINT [PK_a] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)


CREATE TABLE [dbo].[b](
[ID] [int] IDENTITY(450000,1) NOT NULL,
[AccountID] [int] NOT NULL,
[Date] [datetime] NOT NULL,
CONSTRAINT [PK_b] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [FileGroup_s]
) ON [FileGroup_s] TEXTIMAGE_ON [FileGroup_s]

View :

CREATE VIEW [dbo].[View_test]
AS
SELECT CAST(ID AS int) AS ID, CAST(AccountID AS int) AS AccountID, CAST(Date AS datetime) AS Date
FROM (SELECT TOP (100) PERCENT ID + 100000000 AS ID, AccountID, Date
FROM dbo.a
UNION ALL
SELECT TOP (100) PERCENT ID, AccountID, Date
FROM dbo.b) AS TempData

کوئری مورد نظر:

SELECT *
FROM
(SELECT
TOP(100000) Row_Number() over(order by [ID] DESC) AS RowNumber, *
FROM [dbo].[View_test]
WHERE
($PARTITION.PartitionRange(ID) in (SELECT * FROM dbo.AccountStatistics_GetPartitionNumberList(4653) ))
AND [dbo].[View_test].AccountID = 4653)as TempData WHERE RowNumber BetWeen 1 AND 10 ORDER BY ID DESC

چگونه مشکل را حل کنم.
ممنون از همکاری دوستان.