2012-04-21 8 views
84

次の図は、Microsoft SQL Server 2008 R2システムビューの一部です。画像から、sys.partitionsと​​の関係はsys.allocation_units.typeの値に依存することがわかります。一緒に参加するには、私はこれに似たようなものを書くでしょう:JOIN条件でCASE文を使用できますか?

SELECT * 
FROM sys.indexes i 
     JOIN sys.partitions p 
      ON i.index_id = p.index_id 
     JOIN sys.allocation_units a 
      ON CASE 
       WHEN a.type IN (1, 3) 
        THEN a.container_id = p.hobt_id 
       WHEN a.type IN (2) 
        THEN a.container_id = p.partition_id 
       END 

しかし、上のコードでは構文エラーが発生します。私はそれがCASEステートメントのためだと思います。 少し説明できますか?

ありがとうございます!


追加のエラーメッセージ:

Msg 102, Level 15, State 1, Line 6 Incorrect syntax near '='.

this is the image

+13

この美しいDB図を作成するためにどのようなソフトウェアを使用しましたか? – LearnByReading

答えて

145

CASE発現は、句のTHEN部分から値を返します。あなたはそれをこのように使うことができます:

SELECT * 
FROM sys.indexes i 
    JOIN sys.partitions p 
     ON i.index_id = p.index_id 
    JOIN sys.allocation_units a 
     ON CASE 
      WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1 
      WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1 
      ELSE 0 
      END = 1 

返された値で何かする必要があることに注意してください。あなたのステートメントは、代入または等価性の値を返そうとしましたが、どちらもCASE/THEN節の文脈では意味がありません。 (BOOLEANがデータ型だった場合は、平等のためのテストが理にかなって。)

+0

@HABO感謝しています。 ..しかし、問題は私がこれを行うときに条件が崩壊することです...私に教えてくださいどのように私はそれを壊すのですか? –

+1

@SagarTandel - 申し訳ありませんが、私は "落ち着かせる"と "どのように壊すのか"を理解していません。あなたのコメントを明確にできますか? (最近、サバからのダイビングで浮上しました。ニトロックスになるかもしれません。) – HABO

+0

私は欲しくない条件をすべてチェックします。私はそれが条件に合致すると、それを中止したい。 –

13

はこれを試してみてください:

...JOIN sys.allocation_units a ON 
    (a.type=2 AND a.container_id = p.partition_id) 
    OR (a.type IN (1, 3) AND a.container_id = p.hobt_id) 
+0

それはうまくいくかもしれません - 質問の質問は完全に有効と思われます。 OPのコードで何が問題なのかまだ説明していない – zerkms

24

Instead, you simply JOIN to both tables, and in your SELECT clause, return data from the one that matches:

私はあなたがこのリンクを通過することをお勧めConditional Joins in SQL ServerT-SQL Case Statement in a JOIN ON Clause

SELECT * 
FROM sys.indexes i 
     JOIN sys.partitions p 
      ON i.index_id = p.index_id 
     JOIN sys.allocation_units a 
      ON a.container_id = 
      CASE 
       WHEN a.type IN (1, 3) 
        THEN p.hobt_id 
       WHEN a.type IN (2) 
        THEN p.partition_id 
       END 

編集:コメントごと。

You can not specify the join condition as you are doing.. Check the query above that have no error. I have take out the common column up and the right column value will be evaluated on condition.

+0

これは 'CASE'の何が問題なのかを説明していません – zerkms

+0

しかし、それは条件付き結合について説明しています.. –

+0

'条件付き結合 'はどういう意味ですか?各結合(十字を除く)は条件付きです。どのようにこのケースは他のものと異なるのですか?あなたのサンプルには条件付き内部結合があり、OPsクエリには条件付き結合があります。 – zerkms

1

これは、私は2つの異なる結果セットの違いを比較している。ここ

https://bytes.com/topic/sql-server/answers/881862-joining-different-tables-based-condition

FROM YourMainTable 
LEFT JOIN AirportCity DepCity ON @TravelType = 'A' and DepFrom = DepCity.Code 
LEFT JOIN AirportCity DepCity ON @TravelType = 'B' and SomeOtherColumn = SomeOtherColumnFromSomeOtherTable 
+0

私はエラーが発生しました:相関名 'xx'はFROM句に複数回指定されています。 – Etienne

0

素敵なようです。これが参考になることを願っています。

SELECT main.ColumnName, compare.Value PreviousValue, main.Value CurrentValue 
FROM 
(
    SELECT 'Name' AS ColumnName, 'John' as Value UNION ALL 
    SELECT 'UserName' AS ColumnName, 'jh001' as Value UNION ALL 
    SELECT 'Department' AS ColumnName, 'HR' as Value UNION ALL 
    SELECT 'Phone' AS ColumnName, NULL as Value UNION ALL 
    SELECT 'DOB' AS ColumnName, '1993-01-01' as Value UNION ALL 
    SELECT 'CreateDate' AS ColumnName, '2017-01-01' as Value UNION ALL 
    SELECT 'IsActive' AS ColumnName, '1' as Value 
) main 
INNER JOIN 
(
    SELECT 'Name' AS ColumnName, 'Rahul' as Value UNION ALL 
    SELECT 'UserName' AS ColumnName, 'rh001' as Value UNION ALL 
    SELECT 'Department' AS ColumnName, 'HR' as Value UNION ALL 
    SELECT 'Phone' AS ColumnName, '01722112233' as Value UNION ALL 
    SELECT 'DOB' AS ColumnName, '1993-01-01' as Value UNION ALL 
    SELECT 'CreateDate' AS ColumnName, '2017-01-01' as Value UNION ALL 
    SELECT 'IsActive' AS ColumnName, '1' as Value 
) compare 
ON main.ColumnName = compare.ColumnName AND 
CASE 
    WHEN main.Value IS NULL AND compare.Value IS NULL THEN 0 
    WHEN main.Value IS NULL AND compare.Value IS NOT NULL THEN 1 
    WHEN main.Value IS NOT NULL AND compare.Value IS NULL THEN 1 
    WHEN main.Value <> compare.Value THEN 1 
END = 1 
関連する問題