我花了很多时间在这上面,无法弄清楚如何做到这一点。
问题是:
"使用UNION列出提供包含“MVS”或“VSAM”的订单项的供应商。包括供应商ID和名称。"
以下是与每个表相关的规范。
我的代码,我尝试了很多东西。
SELECT VENDOR_ID, VENDOR_NAME, TO_NUMBER(NULL) INVOICE_ID,
TO_CHAR(NULL) LINE_ITEM_DESCRIPTION
FROM VENDORS
UNION
SELECT VENDOR_ID, TO_CHAR(NULL) VENDOR_NAME, INVOICE_ID,
TO_CHAR(NULL) LINE_ITEM_DESCRIPTION
FROM INVOICES
UNION
SELECT TO_NUMBER(NULL) VENDOR_ID, TO_CHAR(NULL) VENDOR_NAME, INVOICE_ID,
LINE_ITEM_DESCRIPTION
FROM INVOICE_LINE_ITEMS
WHERE INSTR(LINE_ITEM_DESCRIPTION, 'MVS') > 0 OR
INSTR(LINE_ITEM_DESCRIPTION, 'VSAM') > 0;
这产生了239行输出。如果我使用JOIN,我会得到3行输出。由于TO_CHAR()和TO_NUMBER()函数,我的输出有很多空格。
示例输出(我采取了点点滴滴,因此您可以看到四列的分布情况)
VENDOR_ID VENDOR_NAME INVOICE_ID LINE_ITEM_DESCRIPTION
34 2
35 Cal State Termite
36 Graylift
37 Blue Cross
37 69
37 111
37 112
38 Venture Communications Int'l
39 Custom Printing Company
1 MVS Online Library
4 MVS JCL
34 VSAM for the Cobol Prog
答案 0 :(得分:2)
如果你的教授意味着你用一个人来实现or
条件,那么我认为要求一个联盟的唯一方法是有意义的。这仍然很奇怪,但至少可能:
select v.vendor_id, v.vendor_name
from vendors v
join invoices i on i.vendor_id = v.vendor_id
join invoice_line_items ili on ili.invoice_id = i.invoice_id
where ili.line_item_description like '%MVS%'
union
select v.vendor_id, v.vendor_name
from vendors v
join invoices i on i.vendor_id = v.vendor_id
join invoice_line_items ili on ili.invoice_id = i.invoice_id
where ili.line_item_description like '%VSAM%'
或者你可以在内联视图或CTE中联合行项目并从中加入,这可能会稍微提高效率,并且可能听起来稍微接近赋值的措辞:
select v.vendor_id, v.vendor_name
from (
select invoice_id
from invoice_line_items
where item_description like '%MVS%'
union
select invoice_id
from invoice_line_items
where item_description like '%VSAM%'
) ili
join invoices i on i.invoice_id = ili.invoice_id
join vendors v on v.vendor_id = i.vendor_id
或者你教授只是在搞乱你。
答案 1 :(得分:0)
作业说要使用工会。它并没有说你应该避免加入。 所以建立两个sql语句的联合,列出' MVS'和' VSAM'分别。虽然适合每日wtf,但它应符合作业说明。