Database
 sql >> डेटाबेस >  >> RDS >> Database

विदेशी कुंजी के माध्यम से किसी तालिका में रिकॉर्ड के संदर्भों की गणना करना

मुझे हाल ही में अपने स्वयं के उद्देश्य के लिए कार्य को हल करने की आवश्यकता है:एक तालिका (फ़ाइल) में प्रत्येक रिकॉर्ड के लिए एक विदेशी कुंजी द्वारा लिंक किए गए बाहरी रिकॉर्ड की संख्या की गणना करने के लिए। फ़ाइल तालिका की विशिष्ट संरचना के लिए कार्य को हल किया गया था, लेकिन यदि आवश्यक हो, तो समाधान को एक सार्वभौमिक रूप में फिर से बनाया जा सकता है।

मैं स्पष्ट कर दूंगा कि समाधान एक अनलोड किए गए डेटाबेस के लिए विकसित किया गया था, लाखों रिकॉर्ड और हर मिनट अपडेट के बिना, इसलिए प्रदर्शन के बारे में ज्यादा चिंता नहीं थी।

मुख्य कारण यह था कि फ़ाइल तालिका के बाहरी लिंक की संख्या विकास के दौरान बदल सकती है और क्वेरी को लगातार फिर से लिखना अनुचित होगा। सिस्टम में एक निश्चित प्रतिरूपकता की योजना बनाई गई थी, इसलिए, सभी अंतिम तालिकाएं बिल्कुल ज्ञात नहीं हैं।

दो लेबल बनाने की स्क्रिप्ट:

CREATE TABLE [dbo].[File](
	[IdFile] [int] IDENTITY(1, 1) NOT NULL,
	[NameFile] [nvarchar](max) NOT NULL,
	[CountUsage] [int] NOT NULL,
	PRIMARY KEY (IdFile)
)

SET identity_insert [dbo].[File] ON;

INSERT INTO [dbo].[File] ([IdFile], [NameFile],[CountUsage])
VALUES (1, 'test1', 0), (2, 'test2', 1000)

SET identity_insert [dbo].[File] OFF;

CREATE TABLE [dbo].[TestForFiles](
	[IdTest] [int] IDENTITY(1, 1) NOT NULL,
	[IdFileForTest] [int] NOT NULL,
	PRIMARY KEY (IdTest)
)

ALTER TABLE [dbo].[TestForFiles]  WITH CHECK ADD  CONSTRAINT [FK_TestForFiles_File] FOREIGN KEY([IdFileForTest])
REFERENCES [dbo].[File] ([IdFile])

ALTER TABLE [dbo].[TestForFiles] CHECK CONSTRAINT [FK_TestForFiles_File]

INSERT INTO [dbo].[TestForFiles] ([IdFileForTest])
VALUES (1), (1), (1), (2)

हमें File और TestForFiles टेबल मिलते हैं। TestForFiles तालिका IdFileForTest फ़ील्ड द्वारा फ़ाइल तालिका को संदर्भित करती है।

हमें निम्न डेटा सेट प्राप्त होता है:

स्क्रिप्ट तालिका में रिकॉर्ड की संख्या की गणना करने के लिए एक क्वेरी उत्पन्न करती है:

DECLARE @sql_tables nvarchar(max) =	null;

SELECT @sql_tables = CASE WHEN @sql_tables IS NULL THEN '' ELSE @sql_tables + CHAR(13) + CHAR(10) + '		UNION ALL' + CHAR(13) + CHAR(10) END + '		SELECT ' + c.name + ' AS IdFile, count(*) AS FileCount FROM ' + t.name + ' GROUP BY ' + c.name
FROM sys.foreign_key_columns AS fk
INNER JOIN sys.tables AS t ON fk.parent_object_id = t.object_id
INNER JOIN sys.columns AS c ON fk.parent_object_id = c.object_id AND fk.parent_column_id = c.column_id
INNER JOIN sys.columns AS c2 ON fk.referenced_object_id = c2.object_id AND fk.referenced_column_id = c2.column_id
WHERE fk.referenced_object_id = (SELECT object_id FROM sys.tables WHERE name = 'File') AND c2.name = 'IdFile';

IF @sql_tables IS NOT NULL
BEGIN
	DECLARE @sql nvarchar(max) =	'UPDATE dbo.[File]' + CHAR(13) + CHAR(10) + 
		'SET CountUsage = t2.FileCount' + CHAR(13) + CHAR(10) + 
		'FROM dbo.[File]' + CHAR(13) + CHAR(10) + 
		'INNER JOIN (' + CHAR(13) + CHAR(10) +
		'	SELECT IdFile, SUM(FileCount) AS FileCount ' + CHAR(13) + CHAR(10) + 
		'	FROM (' + CHAR(13) + CHAR(10) + 
			@sql_tables + CHAR(13) + CHAR(10) + 
		'	) t' + CHAR(13) + CHAR(10) +
		'	GROUP BY IdFile' + CHAR(13) + CHAR(10) +
		') t2 ON t2.IdFile = dbo.[File].IdFile';

	print @sql;
	EXEC sp_executesql @sql;
END;

निम्नलिखित क्वेरी उत्पन्न होती है:

UPDATE dbo.[File]
SET CountUsage = t2.FileCount
FROM dbo.[File]
INNER JOIN (
	SELECT IdFile, SUM(FileCount) AS FileCount 
	FROM (
		SELECT IdFileForTest AS IdFile, count(*) AS FileCount FROM TestForFiles GROUP BY IdFileForTest
	) t
	GROUP BY IdFile
) t2 ON t2.IdFile = dbo.[File].IdFile

निष्पादन के बाद, हमारे पास ऐसी तालिका सामग्री है:

एक बार फिर, एक विशिष्ट फ़ाइल तालिका के लिए कार्य हल किया गया था, गिनती केवल उन मामलों के लिए काम करती है जब IdFile फ़ील्ड पर विदेशी कुंजियाँ होती हैं।

इस लेख का अनुवाद . ने किया है लेखक की अनुमति से कोडिंगसाइट टीम।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ब्लॉकचेन:यह क्या है, यह कैसे काम करता है, और बड़े डेटा के लिए इसका क्या अर्थ है

  2. क्या एक टेबल पर एकाधिक प्राथमिक कुंजी मौजूद हो सकती हैं?

  3. SQL में एक संख्यात्मक कॉलम का अधिकतम मान कैसे खोजें

  4. वसंत एकीकरण क्या है?

  5. प्रदर्शन मिथक:क्लस्टर बनाम गैर-संकुल सूचकांक