我正在使用此处的问题练习我的SQL:http://sqlzoo.net/wiki/AdventureWorks_hard_questions
我遇到第一个问题。我会在这里重新发布,所以你不必点击链接。
对于在达拉斯拥有“主办公室”的每位客户,请显示“主办公室”的AddressLine1和“送货”地址的地址1 - 如果没有送货地址,请将其留空。每个客户使用一行。
涉及的表是CustomerAW(CustomerID为PKey,我认为是唯一相关的字段),CustomerAddress(包含项目CustomerID,AddressID和AddressType)和地址(AddressID,AddressLine1和City是相关字段)。
我现在拥有的是:
public class MyCodeCracker {
private int encry;
public MyCodeCracker(int encry) {
this.encry = encry;
}
public String encrypt(String text) {
// use encry to do encrytion
return ""; // return encrypted text
}
public String decrypt(String encryptedText) {
// use encry to translate encryptedText to text
return ""; // return text
}
public int getEncry() {
return encry;
}
public static void main(String[] args) {
// here get user input
// extract out the encryption int
// create MyCodeCracker with the int
// and then encrypt and decrypt text as needed
}
}
但我不知道如何将送货地址输入第二栏。
答案 0 :(得分:0)
需要某种字段来识别主地址中的哪个地址,哪个是发货地址。假设你有这样一个领域,那么有几种不同的方法可以做到这一点。这是一个有条件聚合的人:
select c.customerid,
max(case when ca.addresstype = 'Main' then a.addressline1 end) as main,
max(case when ca.addresstype = 'Ship' then a.addressline1 end) as ship
from customeraw c
join customeraddress ca on c.customerid = ca.customerid
join address a on ca.addressid = a.addressid
group by c.customerid
having max(case when ca.addresstype = 'Main' then a.city end) = 'Dallas'
另一个选择是多次加入address
表 - 一个用于主办公室,另一个用于运送:
select c.customerid,
a.addressline1 as main,
a2.addressline1 as ship
from customeraw c
join customeraddress ca on c.customerid = ca.customerid
join address a on ca.addressid = a.addressid and ca.addresstype = 'Main'
join address a2 on ca.addressid = a2.addressid and ca.addresstype = 'Ship'
where a.City = 'Dallas'
使用此选项,您可能需要使用outer join
作为送货地址,具体取决于所需的结果。