言語に依存しないデータ(DocumentID、作成日、作成されたユーザーのドキュメントタイプなど)を含むようにドキュメントテーブルを再構築する必要があると思います。
次に、各言語のデータを含む別のテーブル(DocumentVersion)を作成します。ここで、documentidとlanguageIDが主キーを構成します。
DocumentID | LanguageID | Title
ただし、言語コードは言語ごとに一意の値であるため、これを自然な主キーにします(または、sys.syslanguagesを使用できます)。これは、この問題に使用するデータ構造です。
CREATE TABLE Document
( DocumentID INT IDENTITY(1, 1) NOT NULL CONSTRAINT PK_Document_DocumentID PRIMARY KEY,
DefaultTitle VARCHAR(100) NOT NULL,
CreatedDate DATETIME NOT NULL
);
CREATE TABLE dbo.[Language]
( LanguageCode CHAR(5) NOT NULL CONSTRAINT PK_Lanaguage_LanguageCode PRIMARY KEY,
Name VARCHAR(50) NOT NULL,
Alias VARCHAR(50) NOT NULL
);
CREATE TABLE dbo.DocumentVersion
( DocumentFK INT NOT NULL,
LanguageCode CHAR(5) NOT NULL,
Title VARCHAR(50) NOT NULL
CONSTRAINT PK_DocumentVersion PRIMARY KEY (DocumentFK, LanguageCode)
CONSTRAINT FK_DocumentVersion_LanguageCode FOREIGN KEY (LanguageCode) REFERENCES dbo.[Language] (LanguageCode),
CONSTRAINT FK_DocumentVersion_DocumentID FOREIGN KEY (DocumentFK) REFERENCES dbo.Document (DocumentID)
);
INSERT Document (DefaultTitle, CreatedDate)
VALUES
('Document 1', CURRENT_TIMESTAMP),
('Document 2', CURRENT_TIMESTAMP);
INSERT dbo.[Language] (LanguageCode, Name, Alias)
VALUES
('de-DE', 'Deutsch', 'German'),
('en-US', 'US English', 'English'),
('fr-FR', 'Français', 'French');
INSERT dbo.DocumentVersion (DocumentFK, LanguageCode, Title)
VALUES
(1, 'de-DE', 'My German Document 1'),
(2, 'de-DE', 'My German Document 2'),
(1, 'en-US', 'My English Document 1'),
(1, 'fr-FR', 'My French Document 1')
あなたが言った方法でドキュメントを取得するには、正しい順序を取得するためのカスタムのcaseステートメントが必要になります。したがって、上記のサンプルを使用すると、
DECLARE @PrimaryLanguage CHAR(5) = 'fr-FR',
@DefaultLanguage CHAR(5) = 'de-DE';
WITH RankedDocument AS
( SELECT DocumentFK,
LanguageCode,
Title,
SortOrder = CASE WHEN LanguageCode = @PrimaryLanguage THEN 1
WHEN LanguageCode = @DefaultLanguage THEN 2
-- MORE SORTING CRITERIA IF REQURED
ELSE 10
END
FROM DocumentVersion
), Docs AS
( SELECT d.DocumentID,
rd.Title,
d.CreatedDate,
rn = ROW_NUMBER() OVER(PARTITION BY d.DocumentID ORDER BY rd.SortOrder)
FROM Document d
INNER JOIN RankedDocument rd
ON d.DocumentID = rd.DocumentFK
)
SELECT DocumentID, Title, CreatedDate
FROM Docs
WHERE rn = 1;
フランス語のドキュメントの例
ドイツ語文書の例
編集
現在の構造でこれを行うには、フィールドを追加する必要があります。MyItemsTable
これは、デモンストレーションのために、おそらく新しいテーブルへの外部キーである必要がありLinkField
ます。
DECLARE @PrimaryLanguage INT = 1,
@DefaultLanguage INT = 1;
WITH RankedItem AS
( SELECT ID,
Title,
LanguageId,
rn = ROW_NUMBER() OVER(PARTITION BY LinkField ORDER BY CASE LanguageId
WHEN @PrimaryLanguage THEN 1
WHEN @DefaultLanguage THEN 2
ELSE 10
END)
FROM MyItemsTable
)
SELECT ID, Title, LanguageID
FROM RankedItem
WHERE rn = 1;
SQLフィドルのデモ