![](/img/trans.png)
[英]Inserting multiple values from a select query into one JTable column in java
[英]Select query to retrieve results based on multiple values for a one column (AND condition)
有以下三個表
Vehicle_Id主鍵
名稱
序列號
Property_Id主鍵
名稱
Property_Id(FOREIGN KEY)從Propertyname表中引用Property_Id
值
ID(FOREIGN KEY)引用了Vehicle表中的Vehicle_Id
Vehicle_Id Name Serial_Number
1000 WagonR Maruti-WagonR
1001 Estilo Maruti-Estilo
1002 Zen Maruti-Zen
Property_Id name
100 Mileage
101 FuelType
102 Country
Property_Id Value Id
100 50 1000
101 Petrol 1000
102 India 1000
100 35 1001
101 Diesel 1002
從這三個表中,我們可以看到每輛車都有一組屬性,這些屬性在“屬性”表中保留為行。 這樣做是為了在向車輛添加更多屬性的情況下,為車輛添加行條目,而不是添加不可行的列。
現在,我有一個用戶界面,可以在其中基於車輛進行搜索
1)名稱,序列號-可在“車輛”表中的列中使用,
2)里程,燃油類型,國家/地區-這些是特定車輛的屬性
用戶可以在上面的1)和2)中輸入值的任意組合以搜索車輛列表。
例如:-如果用戶輸入Mileage為50,FuelType為Diesel,則我應獲取Mileage為50 AND FuelType為Diesel的車輛的結果。
我嘗試以下SQL語句執行相同的操作
select vh.Vehicle_Id, vh.name, pt.Property_Id, pn.name, pt.value
from property pt
inner join propertyname pn
on pt.Property_Id=pn.Property_Id
inner join vehicle vh
on vh.Vehicle_Id=pt.Id
and ((pn.Name='Mileage' AND pt.Value='50') AND (pn.Name='FuelType' AND pt.Value='Petrol'));
但是由於單行結果的AND條件,我得到的結果為零。 但是,如果我將最后一個AND條件更改為OR,則會得到兩個符合條件的結果。
但是我試圖獲取同時匹配兩個屬性的車輛。
我嘗試使用INTERSECT,兩個SQL語句的內部聯接等。但是無法獲得結果。
任何人都可以建議我最好的方法來搜索兩個屬性名稱,即以行而不是列存在的值對,以獲取准確的搜索結果。
您的問題是PropertyName不能同時為'Mileage'和'FuelType'
您可以找到所有id在兩個propertyNames相交處的所有車輛,如下所示
select Vehicle_Id, Vehicle.Name, Serial_Number, PropertyName.Name, Property.Value
from Vehicle
join Property on (Property.Id = Vehicle.Vehicle_Id)
join PropertyName on (PropertyName.Property_Id = Property.Property_Id)
where Vehicle_id in
(select Id
from PropertyName
Join Property on (PropertyName.Property_Id = Property.Property_Id)
where PropertyName.Name = 'Mileage' and Property.Value = '50'
intersect
select Id
from PropertyName
Join Property on (PropertyName.Property_Id = Property.Property_Id)
where PropertyName.Name='FuelType' AND Property.Value='Petrol'
)
Vehicle_Id Name Serial_Number Name Value
1000 WagonR Maruti-WagonR Mileage 50
1000 WagonR Maruti-WagonR FuelType Petrol
1000 WagonR Maruti-WagonR Country India
有多種方法
我會做這樣的事情
select vh.Vehicle_Id, pt_m.value as [Mileage], pt_f.value as [FuelType]
from vehicle vh
inner join propertyname pn_m ON pn_m.Name='Mileage'
inner join propertyname pn_f ON pn_f.Name='FuelType'
inner join property pt_m on pt_m.Property_Id=pn_m.Property_Id AND pt_m.Id = vh.Vehicle_Id
inner join property pt_f on pt_f.Property_Id=pn_f.Property_Id AND pt_f.Id = vh.Vehicle_Id
加入兩個屬性時,需要為屬性名稱表使用兩個別名,並且類似地,需要為屬性值使用兩個別名
這樣做的優點是,它可以快速適應於其中實際上沒有填充其中一項屬性的車輛
select vh.Vehicle_Id, pt_m.value as [Mileage], pt_f.value as [FuelType]
from vehicle vh
left join propertyname pn_m ON pn_m.Name='Mileage'
LEFT join propertyname pn_f ON pn_f.Name='FuelType'
LEFT join property pt_m on pt_m.Property_Id=pn_m.Property_Id AND pt_m.Id = vh.Vehicle_Id
LEFT join property pt_f on pt_f.Property_Id=pn_f.Property_Id AND pt_f.Id = vh.Vehicle_Id
甚至處理不一致的屬性名稱
select vh.Vehicle_Id, pt_m.value as [Mileage], pt_f.value as [FuelType]
from vehicle vh
left join propertyname pn_m ON pn_m.Name='Mileage'
LEFT join propertyname pn_f ON pn_f.Name IN ('FuelType','Fuel Type')
LEFT join property pt_m on pt_m.Property_Id=pn_m.Property_Id AND pt_m.Id = vh.Vehicle_Id
LEFT join property pt_f on pt_f.Property_Id=pn_f.Property_Id AND pt_f.Id = vh.Vehicle_Id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.