Gambar berikut ini adalah bagian dari Microsoft SQL Server 2008 R2 Pandangan Sistem. Dari gambar dapat kita lihat bahwa hubungan antara sys.partisi
dan sys.allocation_units
tergantung pada nilai sys.allocation_units.jenis
. Jadi untuk bergabung dengan mereka bersama-sama aku akan menulis sesuatu yang mirip dengan ini:
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
Tapi atas kode kesalahan sintaks. Saya kira bahwa's karena KASUS
pernyataan.
Ada yang bisa membantu untuk menjelaskan sedikit?
Tambahkan pesan kesalahan:
Msg 102, 15 Tingkat, Negara bagian 1, Baris 6 Salah sintaks dekat '='.
KASUS
ekspresi mengembalikan nilai dari KEMUDIAN
bagian dari klausa. Anda bisa menggunakannya thusly:
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
Perhatikan bahwa anda perlu melakukan sesuatu dengan nilai yang dikembalikan, misalnya membandingkannya dengan 1. Pernyataan anda berusaha untuk mengembalikan nilai tugas atau ujian kesetaraan, baik yang masuk akal dalam konteks KASUS
/KEMUDIAN
klausa. (Jika BOOLEAN
adalah datatype kemudian tes untuk kesetaraan akan masuk akal.)
Sebaliknya, anda hanya BERGABUNG untuk kedua tabel, dan anda PILIH klausa, mengembalikan data dari salah satu yang sesuai:
Saya sarankan anda untuk pergi melalui link ini Bersyarat Bergabung di SQL Server dan https://stackoverflow.com/questions/8361183/t-sql-case-statement-in-a-join-on-clause
misalnya
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
Edit: Sebagai per komentar.
Anda tidak dapat menentukan kondisi join seperti yang anda lakukan.. Cek query di atas yang tidak memiliki kesalahan. Saya telah mengambil umum kolom up dan kolom kanan nilainya akan dievaluasi pada kondisi.
Saya pikir anda perlu dua laporan kasus:
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON
-- left side of join on statement
CASE
WHEN a.type IN (1, 3)
THEN a.container_id
WHEN a.type IN (2)
THEN a.container_id
END
=
-- right side of join on statement
CASE
WHEN a.type IN (1, 3)
THEN p.hobt_id
WHEN a.type IN (2)
THEN p.partition_id
END
Hal ini karena:
Hal ini tampaknya bagus
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
Saya ambil contoh anda dan mengeditnya:
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 p.hobt_id
WHEN a.type IN (2)
THEN p.partition_id
ELSE NULL
END = a.container_id
Mengambil DonkeyKong's contoh.
Masalah yang saya butuhkan untuk menggunakan variabel dinyatakan. Hal ini memungkinkan untuk menyatakan kiri dan sisi kanan dari apa yang anda butuhkan untuk membandingkan. Ini adalah untuk mendukung SSRS report di mana bidang yang berbeda harus dihubungkan berdasarkan pemilihan oleh pengguna.
Awal kasus ini menetapkan bidang pilihan berdasarkan pilihan dan kemudian saya dapat mengatur bidang saya perlu pertandingan untuk bergabung.
Kasus kedua pernyataan yang bisa ditambahkan untuk sisi kanan jika variabel ini diperlukan untuk memilih dari berbagai bidang
LEFT OUTER JOIN Dashboard_Group_Level_Matching ON
case
when @Level = 'lvl1' then cw.Lvl1
when @Level = 'lvl2' then cw.Lvl2
when @Level = 'lvl3' then cw.Lvl3
end
= Dashboard_Group_Level_Matching.Dashboard_Level_Name
Di sini saya telah membandingkan perbedaan dua hasil yang berbeda set. Harapan ini mungkin bisa membantu.
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