UNION 3不包含相同属性的表

时间:2015-02-27 21:29:56

标签: sql oracle

我花了很多时间在这上面,无法弄清楚如何做到这一点。

问题是:

"使用UNION列出提供包含“MVS”或“VSAM”的订单项的供应商。包括供应商ID和名称。"

以下是与每个表相关的规范。

  • VENDORS表包含VENDOR_ID和VENDOR_NAME属性。
  • INVOICES表包含属性VENDOR_ID和INVOICE_ID。
  • INVOICE_LINE_ITEMS表包含属性INVOICE_ID和LINE_ITEM_DESCRIPTIONS

我的代码,我尝试了很多东西。

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 

2 个答案:

答案 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,但它应符合作业说明。