iT邦幫忙

0

資料庫如何相同重複查詢

Rong 2023-08-03 09:53:231918 瀏覽
  • 分享至 

  • xImage

想請教各位大大,不曉得以下做法有沒有辦法達到

資料表
Item
https://ithelp.ithome.com.tw/upload/images/20230803/20127924qynXJYAzOc.png

Class
https://ithelp.ithome.com.tw/upload/images/20230803/20127924gCl18Y3GK2.png

想要的結果
https://ithelp.ithome.com.tw/upload/images/20230803/20127924XUOgJ0QP0W.png

關聯圖
https://ithelp.ithome.com.tw/upload/images/20230803/20127924fgURItaYrf.png

Item 的 Item_Type_ID 跟 Item_Brand_ID 都要關連 Class_ID
有沒有辦法重複對同個資料表重複關連不同的欄位
我目前的作法是在程式中建立兩個 Item_Type 跟 Item_Brand 的 class 分兩次查詢產生資料後再抓取用 Class_Key 去做判別
SELECT * FROM Class WHERE Item_Key = 'Item_Type' AND Class_ID = + Item_Type_ID
SELECT * FROM Class WHERE Item_Key = 'Item_Brand' AND Class_ID = + Item_Brand_ID

想知道有可以一段語法就撈出想要的資料的方法嗎?謝謝!

Ray Zhou iT邦新手 5 級 ‧ 2023-08-04 10:22:03 檢舉
SELECT *
FROM dbo.Item i
INNER JOIN dbo.Class c1 ON i.Item_ID=c1.Class_Auto_ID
INNER JOIN dbo.Class c2 ON i.Item_Name=c2.Class_Auto_ID

不知道這樣有沒有符合你想要的資料
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
wjing
iT邦新手 1 級 ‧ 2023-08-03 12:02:16
最佳解答

Left Join兩次哩 ?

Select a.Item_ID, a.Item_Name, a.Item_Type_ID, IFNULL(b.Class_Name, '') as Item_Type_Name
, a.Item_Brand_ID, IFNULL(c.Class_Name, '') as Item_Brand_Name
from Item a
Left Join Class b on b.Class_Key = 'Item_Type' and a.Item_Type_ID = b.Class_ID
Left Join Class c on c.Class_Key = 'Item_Brand' and a.Item_Brand_ID = c.Class_ID

結果會像下面這樣,不過Itme_ID=2、1 的好像不太對?
https://ithelp.ithome.com.tw/upload/images/20230803/20110063lKpsa34pmW.png

試試看

他的關聯ID沒指出來~

Rong iT邦新手 5 級 ‧ 2023-08-03 18:49:46 檢舉

不好意思!!想要的結果圖我少輸入了!!

您的結果就是我想要的!!

非常感謝您!!我嘗試一下您的方式!!

0
純真的人
iT邦大師 1 級 ‧ 2023-08-03 10:34:43

改子查詢

declare @Class table(
	Class_Auto_ID int
	,Class_Key nvarchar(50)
	,Class_ID nvarchar(50)
	,Class_Name nvarchar(50)
)

declare @Item table(
	Item_ID int
	,Item_Name int
	,Item_Type_ID nvarchar(50)
	,Item_Brand_ID nvarchar(50)
)

insert into @Class
values(1,'Item_Type','A','AA')
,(3,'Item_Brand','AA','AA')
,(2,'Item_Type','B','BB')

insert into @Item
values(2,2,'','AA')
,(4,4,'','')
,(1,1,'A','')
,(3,3,'B','AA')



SELECT Item_ID
,Item_Name
,Item_Type_ID
,isNull((select top 1 Class_Name from @Class where Item_Name = Class_Auto_ID and Class_ID = Item_Type_ID ),'') Item_Type_Name
,Item_Brand_ID
,isNull((select top 1 Class_Name from @Class where Item_Name = Class_Auto_ID and Class_ID = Item_Brand_ID ),'') Item_Brand_Name
FROM @Item


https://ithelp.ithome.com.tw/upload/images/20230803/20061369diGPRkJ6hQ.png

Rong iT邦新手 5 級 ‧ 2023-08-03 10:58:15 檢舉

我瞭解哦,但是我想要撈出來的資料可以產生2次Class中的內容這樣,可能我表達得不是很清楚,感謝您的回覆!

那可以改用子查詢~

不過你的關聯不明~我抓出來的資料~跟你的結果不一樣~

Rong iT邦新手 5 級 ‧ 2023-08-03 18:48:46 檢舉

不好意思!!想要的結果圖我少輸入了!!
2 的 Item_Brand_Name 是 AA
1 的 Item_Type_Name 是 A

非常感謝您!!我嘗試一下您的方式!!

0
rogeryao
iT邦超人 7 級 ‧ 2023-08-03 19:24:29
Create table Class (
Class_Auto_ID int,
Class_Key nvarchar(30),
Class_ID nvarchar(30),
Class_Name nvarchar(30));

insert into Class values
(1,'Item_Type','A','A'),
(3,'Item_Brand','AA','AA'),
(2,'Item_Type','B','B');
Create table Item (
Item_ID int,
Item_Name int,
Item_Type_ID nvarchar(30),
Item_Brand_ID nvarchar(30));

insert into Item values
(2,2,'','AA'),
(4,4,'',''),
(1,1,'A',''),
(3,3,'B','AA');
Select M.Item_ID,M.Item_Name,M.Item_Type_ID,
  case When (R.Class_Key = 'Item_Type') and (Q.Class_Key = 'Item_Brand') then R.Class_Name else '' end as Item_Type_Name,
  M.Item_Brand_ID,
  case When (R.Class_Key = 'Item_Type') and (Q.Class_Key = 'Item_Brand') then Q.Class_Name else '' end as Item_Brand_Name
From Item AS M
Left join Class As R on (R.Class_ID = M.Item_Type_ID) and (R.Class_Key = 'Item_Type')
Left join Class As Q on (Q.Class_ID = M.Item_Brand_ID) and (Q.Class_Key = 'Item_Brand')

Demo

我要發表回答

立即登入回答