查询表1中的所有值,仅查询表2中的匹配

时间:2017-04-10 08:57:03

标签: sql oracle full-outer-join

我需要构建一个查询,以便始终显示表A中的记录,并在2列匹配时从表B中显示。

表A包含记录列表,我想一直显示,即插槽列表1 - 3.

表B有一个动态值列表,其中有1列( Table_B_Location_Code )已经分配了与表A匹配的标识符,但是第二列( Table_B_Slot_ID )将在稍后更新。

最好的情况是,表A内容始终显示,因此表B内容具有 Table_B_Location_Code 和 分配 Table_B_Slot_ID ,让它出现。

另外,我在表B中有一个日期列。这意味着,如果日期等于sysdate( to_char(TABLE_B_DATE,'ddmmyyyy') = to_char(sysdate,'ddmmyyyy') ),我只想考虑表B中的项目。

我猜这是LEFT OUTER JOIN。但我无法让它发挥作用。

CREATE TABLE Table_A (
    Table_A_ID int,
    Table_A_Location_Code varchar(255),
    Table_A_Slot_ID int
);

CREATE TABLE Table_B (
Table_B_ID int,
Table_B_Location_Code varchar(255),
Table_B_Slot_ID int,
TABLE_B_DATE date);

INSERT INTO Table_A (Table_A_ID,Table_A_Location_Code,Table_A_Slot_ID)
VALUES (1, 'Room1', 1);
INSERT INTO Table_A (Table_A_ID,Table_A_Location_Code,Table_A_Slot_ID)
VALUES (1, 'Room1', 2);
INSERT INTO Table_A (Table_A_ID,Table_A_Location_Code,Table_A_Slot_ID)
VALUES (1, 'Room1', 3);

INSERT INTO Table_B (Table_B_ID,Table_B_Location_Code,Table_B_Slot_ID,TABLE_B_DATE)
VALUES (1, 'Room1', 1, 12-04-2017);
INSERT INTO Table_B (Table_B_ID,Table_B_Location_Code,Table_B_Slot_ID,TABLE_B_DATE)
VALUES (1, 'Room1', 0, 12-01-2017);
INSERT INTO Table_B (Table_B_ID,Table_B_Location_Code,Table_B_Slot_ID,TABLE_B_DATE)
VALUES (1, 'Room1', 0, 12-04-2017);

Select * from Table_A;
Select * from Table_B;

2 个答案:

答案 0 :(得分:0)

你是对的,你需要一个left join

select  ta.*, tb.Table_B_Slot_ID
from    Table_A ta
left join
        Table_B tb
on      ta.Table_A_ID = tb.Table_B_ID and
        ta.Table_A_Slot_ID = tb.Table_B_Slot_ID

如果要在表B中不匹配的行中显示某个值而不是null,则可以使用合并

select  ta.*, coalesce(tb.Table_B_Slot_ID, -1)

修改(在编辑问题后)

如果您只需要考虑具有特定值的表B行,那么您可以做的最好是将该条件添加到join条件

select  ta.*, tb.Table_B_Slot_ID
from    Table_A ta
left join
        Table_B tb
on      ta.Table_A_ID = tb.Table_B_ID and
        ta.Table_A_Slot_ID = tb.Table_B_Slot_ID and
        to_char(tb.TABLE_B_DATE,'ddmmyyyy') = to_char(sysdate,'ddmmyyyy')

答案 1 :(得分:0)

这有助于您:?

Select * from Table_A LEFT JOIN Table_B 
    on Table_A.Table_A_SLOT_ID = Table_B.Table_B_SLOT_ID and 
    TABLE_A.Table_A_Location_Code = Table_B.Table_B_Location_Code and
    to_char(Table_B.Table_B_DATE,'ddmmyyyy') = to_char(sysdate,'ddmmyyyy');