2016-09-16 15 views
0

私は、データベーステーブルのフィールドタイプを定義し、ダッシュボードの作成中に選択されたユーザ定義フィールドのリストを、ロジックごとに選択された値とともにプルダウンする動的クエリを作成しています演算子。TSQL条件付き結合ステートメント?

例えば、field1employeeIDを選択できます。彼らは検索したいIDを提供することができ、データをレンダリングする必要があるときはfieldIDfieldValueをテーブルに格納します。

選択したフィールドによっては、従業員の名前などの詳細情報を得るために別のテーブルに参加する必要があります。

これは簡単ですが、複数の可能なテーブルに対して値を結合する必要がある場合は、面倒な部分が発生します。 employeeIDが格納されている場合は、そのフィールドをemployeeテーブルに追加します。しかし、私がstoreIDを保存していた場合は、そのフィールドをstoresテーブルに追加する必要があります。

私が最後まで気づいて、私が立ち往生する前に、私の考えがありました。基本的に、私は、このフィールドは、私たちemployeeTableに参加し、その後、人々テーブルisPeople=1だった場合」と言うつもりだった。

このフィールドisTool=1場合は、当社のツールのテーブルを結合します。

私は基本的にfieldTypefieldValueを持っているに基づいてタイプは、私が保存されている値に特定のテーブルに参加する必要があります。

enter image description here

私はこの作ること、動的SQLを介して働いていたとして、私は私がを使用することができなかったことに気づきました私のIF条件を作成するためのフィールド。

ie。 IF (fl.isPeople =1) BEGIN ... JOIN Employee Table ... END

これを行うにはダイナミックなアプローチが唯一の方法だったと思いましたが、今は自分の問題の解決策を考えることができません。

結論で

...

私は、条件に基づいて、テーブルやクエリのフィールドに参加しようとしています。私は通常のストアドプロシージャでそれを行うように見えなかったので、私は動的にそれをやろうとしましたが、ここで終わり、私が説明しようとしているこの非常に混乱の問題です。

私がさらに明確にできるかどうかを教えてください。

更新:

USE [red] 
GO 
/****** Object: StoredProcedure [dbo].[ti2_fetch_dashboard] Script Date: 9/15/2016 9:55:39 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  Carl 
-- Create date: Sept 13, 2016 
-- Description: Fetch Single Dashboard for Editing 
-- ============================================= 
ALTER PROCEDURE [dbo].[ti2_fetch_dashboard_test] 
@dashboardID INT, @SQL NVARCHAR(MAX) = '' 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Fetch our dashboard 
    SELECT @SQL = 'SELECT d.dashboardID, 
      d.dashboardOwner, 
      e.PreferredName AS ownerFirst, 
      e.LastName AS ownerLast, 
      e.NTID AS ownerNTID, 
      d.dashboardTitle, 
      d.dashboardDescription, 
      d.dashboardType, 
      d.creator, 
      d.timestamp, 
      d.lastUpdate, 
      d.isDeleted, 
      (SELECT sub.QID AS subscriberQID, 
        e.PreferredName AS subscriberFirst, 
        e.LastName AS subscriberLast, 
        e.NTID AS subscriberNTID 
      FROM dbo.ti_dashboard_subscribers AS sub 
        LEFT OUTER JOIN 
        dbo.EmployeeTable AS e 
        ON sub.QID = e.QID 
      WHERE sub.dashboardID = d.dashboardID 
      FOR XML PATH (''options''), ELEMENTS, TYPE, ROOT (''subscribers'')), 
      (SELECT f.fid, 
        f.fieldID, 
        f.[order], 
        cfg.primaryAllowed, 
        cfg.secondaryAllowed, 
        cfg.exportAllowed, 
        mf.fieldName, 
        mf.placeholder 
      FROM  dbo.ti_dashboards_fields AS f 
        INNER JOIN 
        dbo.ti_dashboard_field_types AS ft 
        ON f.typeID = ft.fieldTypeID 
        INNER JOIN 
        dbo.ti_dashboard_master_fields_config AS cfg 
        ON f.fieldID = cfg.fieldID 
        INNER JOIN 
        dbo.ti_dashboards_master_fields AS mf 
        ON mf.fieldID = f.fieldID 
      WHERE f.dashboardID = d.dashboardID 
        AND ft.fieldTypeName = ''Primary'' 
      ORDER BY f.[order] ASC 
      FOR  XML PATH (''fields''), ELEMENTS, TYPE, ROOT (''primaryFields'')), 
      (SELECT f.fid, 
        f.fieldID, 
        f.[order], 
        cfg.primaryAllowed, 
        cfg.secondaryAllowed, 
        cfg.exportAllowed, 
        mf.fieldName, 
        mf.placeholder 
      FROM  dbo.ti_dashboards_fields AS f 
        INNER JOIN 
        dbo.ti_dashboard_field_types AS ft 
        ON f.typeID = ft.fieldTypeID 
        INNER JOIN 
        dbo.ti_dashboard_master_fields_config AS cfg 
        ON f.fieldID = cfg.fieldID 
        INNER JOIN 
        dbo.ti_dashboards_master_fields AS mf 
        ON mf.fieldID = f.fieldID 
      WHERE f.dashboardID = d.dashboardID 
        AND ft.fieldTypeName = ''Secondary'' 
      ORDER BY f.[order] ASC 
      FOR  XML PATH (''fields''), ELEMENTS, TYPE, ROOT (''secondaryFields'')), 
      (SELECT f.fid, 
        f.fieldID, 
        f.[order], 
        cfg.primaryAllowed, 
        cfg.secondaryAllowed, 
        cfg.exportAllowed, 
        mf.fieldName, 
        mf.placeholder 
      FROM  dbo.ti_dashboards_fields AS f 
        INNER JOIN 
        dbo.ti_dashboard_field_types AS ft 
        ON f.typeID = ft.fieldTypeID 
        INNER JOIN 
        dbo.ti_dashboard_master_fields_config AS cfg 
        ON f.fieldID = cfg.fieldID 
        INNER JOIN 
        dbo.ti_dashboards_master_fields AS mf 
        ON mf.fieldID = f.fieldID 
      WHERE f.dashboardID = d.dashboardID 
        AND ft.fieldTypeName = ''Export'' 
      ORDER BY f.[order] ASC 
      FOR  XML PATH (''fields''), ELEMENTS, TYPE, ROOT (''exportFields'')), 
      (SELECT l.[fieldID], 
        -- Get the details of each of those fields 
        (SELECT fl.queryField, 
          fl.allowMultiple, 
          fl.isPeople, 
          fl.isDate, 
          fl.isSelect, 
          fl.isInput, 
          fl.isTool, 
          fl.selectOptions, 
          -- Get the values associcated with the fields 
          (SELECT dv.value'; 

          -- If fl.isPeople = 1 
          SELECT @SQL += ', e.PreferredName AS FirstName, e.LastName, e.NTID, e.QID '; 

          -- If fl.isTool = 1 
          SELECT @SQL += ', t.toolName, t.toolType '; 

          -- Primary Table 
          SELECT @SQL += 'FROM dbo.ti_dashboards_logic AS dv '; 

          -- If fl.isPeople = 1 
          SELECT @SQL += 'LEFT OUTER JOIN dbo.EmployeeTable AS e ON dv.value = e.QID '; 

          -- If fl.isTool = 1 
          SELECT @SQL += 'LEFT OUTER JOIN ti_tools AS t ON dv.value = t.tool '; 

          -- Rest of Statement 
          SELECT @SQL += 'WHERE dv.fieldID = l.fieldID 
            AND dv.dashboardID = d.dashboardID 
           FOR XML PATH (''data''), TYPE, ELEMENTS, ROOT (''values'')) 
         FROM dbo.ti_dashboard_master_fields_config AS fl 
         WHERE fl.fieldID = l.fieldID 
          AND l.dashboardID = d.dashboardID 
         FOR XML PATH (''fields''), TYPE, ELEMENTS, ROOT (''logicMeta'')) 
      FROM  [red].[dbo].[ti_dashboards_logic] AS l 
      WHERE l.dashboardID = d.dashboardID 
      GROUP BY l.fieldID, l.dashboardID 
      FOR  XML PATH (''fields''), TYPE, ELEMENTS, ROOT (''logicFields'')), 
      (SELECT sdb.dashboardID , 
         sdb.fieldID , 
         sdb.sort , 
         sdb.[order] , 
         mf.fieldName 
       FROM dbo.ti_dashboards_sorting AS sdb 
       JOIN dbo.ti_dashboard_master_fields_config AS sf 
       ON sdb.fieldID = sf.fieldID 
       JOIN dbo.ti_dashboards_master_fields AS mf 
       ON sf.fieldID = mf.fieldID 
       WHERE sdb.dashboardID = d.dashboardID 
       ORDER BY sdb.[order] ASC 
       FOR XML PATH (''fields''), TYPE, ELEMENTS, ROOT (''sortingFields'') 
      ) 
    FROM dbo.ti_dashboards AS d 
      LEFT OUTER JOIN 
      dbo.EmployeeTable AS e 
      ON d.dashboardOwner = e.QID 
    WHERE d.dashboardID = @_dashboardID 
      AND d.isDeleted = 0 
    FOR XML PATH (''data''), ELEMENTS, TYPE, ROOT (''root'')'; 

    EXEC sp_executesql @SQL, N'@_dashboardID INT', @_dashboardID = @dashboardID 

END 
+0

投稿コード – Amit

+0

ORMツールを使用してコードレイヤーでより動的なクエリを作成できるようになるか、複数のクエリを使用してデータを抽出することができますDBを1つにまとめようとするのではなく、DBを使用しています。私はあなたが行っている道を歩き回っており、動的に動的なクエリを行うのは良い方法ではありません。あなたのデータセットがちょっと大きければ、すぐにパフォーマンスの問題に陥るでしょう。 –

+0

また、すべてのフィールドをユーザーに提供し、それらを空白( 'NULL')のままにして、結合条件でそのフィールドを確認できますか?そうすれば、使用されているパラメータに対してのみ、常にすべてのテーブルを結合することができます。 – NickyvV

答えて

0

あなたは、データおよび各行ごとに異なる数の列に牽引され、動的にテーブルを結合することはできません。

複数のSELECTクエリの結果を結合するには、UNIONを使用するだけです。各SELECTクエリには、異なるジョインとWHEREステートメント(isPeople、isToolなど)があります。

それとも、関連するすべてのテーブルを結合し、擬似コード以下のようなON文で複数の条件を追加することができます。

SELECT e.xxxx, t.yyyy, dv.zzzz, fl.ffff 
FROM dbo.ti_dashboards_logic AS dv 
    JOIN dbo.ti_dashboard_master_fields_config AS fl ON .... 
    LEFT OUTER JOIN dbo.EmployeeTable AS e ON dv.value = e.QID AND fl.isPeople = 1 
    LEFT OUTER JOIN ti_tools AS t ON dv.value = t.tool AND fl.isTool = 1 

だから、各行が同じ列数を持ち、かつt.yyyyとe.xxxxは次のようになりますfl.isToolおよびfl.isPeopleの値に応じてNULLまたはNULLではありません。

+0

あなたが示唆しているものの疑似コードを提供することは可能でしょうか? – SBB

+0

私の答えを更新しました。コードは実際には大きすぎて読みにくいです。一時テーブルまたはテーブル変数を使用して、複数の部分に分割する必要があります。 – Anton