Присоединиться к таблице, где имя таблицы является значением в другой таблице

перейти к SWIFT 3 и APACHE простому Auth:

func urlSession(_ session: URLSession, task: URLSessionTask,
                didReceive challenge: URLAuthenticationChallenge,
                completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

    let credential = URLCredential(user: "test",
                                   password: "test",
                                   persistence: .none)

    completionHandler(.useCredential, credential)


}
2
задан Neo 5 March 2019 в 10:12
поделиться

1 ответ

Вам уже говорили, что этот подход совершенно неправильный. Но если вам нужно придерживаться этого, вы можете попробовать это:

Ваш тестовый сценарий в новой базе данных (осторожно, если вы уже используете это имя базы данных ...)

USE master;
GO
CREATE DATABASE MyTestDb;
GO
USE MyTestDb;
GO
CREATE TABLE [dbo].[TableA](
  [ID] [int] NOT NULL,
  [Title] [nvarchar](100) NOT NULL,
  [TableBID] [int] NOT NULL
  );
CREATE TABLE [dbo].[TableB](
  [ID] [int] NOT NULL,
  [TableName] [nvarchar](100) NOT NULL
  );
CREATE TABLE [dbo].[ATTR_A](
  [ID] [int] NOT NULL,
  [TableAID] [int] NOT NULL,
  [A21] [nvarchar](100) NOT NULL,
  [A22] [int] NOT NULL
  );
CREATE TABLE [dbo].[ATTR_B](
  [ID] [int] NOT NULL,
  [TableAID] [int] NOT NULL,
  [A21] [nvarchar](100) NOT NULL,
  [A22] [int] NOT NULL
  );
CREATE TABLE [dbo].[ATTR_C](
  [ID] [int] NOT NULL,
  [TableAID] [int] NOT NULL,
  [A21] [nvarchar](100) NOT NULL,
  [A22] [int] NOT NULL
  );
CREATE TABLE [dbo].[ATTR_D](
  [ID] [int] NOT NULL,
  [TableAID] [int] NOT NULL,
  [A21] [nvarchar](100) NOT NULL,
  [A22] [int] NOT NULL
  );  
  INSERT INTO TableA VALUES(1, 'test', 1);
  INSERT INTO TableB VALUES(1, 'ATTR_C');
  INSERT INTO ATTR_C VALUES (1, 1, 'Name', 2019);
  INSERT INTO TableA VALUES(2, 'test2', 2);
  INSERT INTO TableB VALUES (2, 'ATTR_A');
  INSERT INTO ATTR_A VALUES (1, 2, 'Name 2', 2016);
GO

- Я создаю встроенную табличную функцию , где все таблицы атрибутов возвращаются как один набор, используя UNION ALL
- Механизм достаточно умен, чтобы избежать вызова, если параметр не подходит.

CREATE FUNCTION dbo.GetTheRightSet(@SetKey VARCHAR(10))
RETURNS TABLE
AS
RETURN
    SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_A WHERE @SetKey='ATTR_A'
    UNION ALL
    SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_B WHERE @SetKey='ATTR_B'
    UNION ALL
    SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_C WHERE @SetKey='ATTR_C'
    UNION ALL
    SELECT ID,TableAID,A21,A22 FROM dbo.ATTR_D WHERE @SetKey='ATTR_D'
GO

- Вот как это использовать

SELECT TableA.*
      ,TableB.*
      ,TheSet.* 
FROM TableA 
LEFT JOIN TableB ON TableA.TableBID = TableB.ID 
OUTER APPLY dbo.GetTheRightSet(TableB.TableName) TheSet
GO

- Очистить (осторожно с реальными данными)

USE master;
GO
DROP DATABASE MyTestDb;
0
ответ дан Shnugo 5 March 2019 в 10:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: