查询 table 1 中的所有值,仅查询 table 2 中的匹配值
Query all values from table 1 and only the matching from table 2
我需要构建一个查询,以便始终显示来自 Table A 的记录,并在 2 列匹配时显示来自 Table B 的记录。
TableA 包含一个记录列表,我想一直显示,即插槽列表 1 - 3。
Table B 有一个动态的值列表,其中有 1 列 (Table_B_Location_Code) 已经分配了匹配 [=40 的标识符=] A,不过第二列(Table_B_Slot_ID)稍后会更新。
最好的情况是,Table A 内容一直显示,因此 Table B 内容具有 Table_B_Location_Code 和
Table_B_Slot_ID赋值,让它出现。
此外,我在 TABLE B 中有一个日期列。这意味着,如果日期等于 sysdate (to_char(TABLE_B_DATE,'ddmmyyyy') = to_char(sysdate,'ddmmyyyy')
).
,我只想考虑来自 TABLE 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;
你说得对,你需要一个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
如果你想在 table B 上不匹配的行中显示一些值而不是 null
,你可以使用 coalesce
select ta.*, coalesce(tb.Table_B_Slot_ID, -1)
编辑(编辑问题后)
如果您只需要考虑具有特定值的 table 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')
这对您有帮助吗:?
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');
我需要构建一个查询,以便始终显示来自 Table A 的记录,并在 2 列匹配时显示来自 Table B 的记录。
TableA 包含一个记录列表,我想一直显示,即插槽列表 1 - 3。
Table B 有一个动态的值列表,其中有 1 列 (Table_B_Location_Code) 已经分配了匹配 [=40 的标识符=] A,不过第二列(Table_B_Slot_ID)稍后会更新。
最好的情况是,Table A 内容一直显示,因此 Table B 内容具有 Table_B_Location_Code 和 Table_B_Slot_ID赋值,让它出现。
此外,我在 TABLE B 中有一个日期列。这意味着,如果日期等于 sysdate (to_char(TABLE_B_DATE,'ddmmyyyy') = to_char(sysdate,'ddmmyyyy')
).
我猜这是一个 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;
你说得对,你需要一个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
如果你想在 table B 上不匹配的行中显示一些值而不是 null
,你可以使用 coalesce
select ta.*, coalesce(tb.Table_B_Slot_ID, -1)
编辑(编辑问题后)
如果您只需要考虑具有特定值的 table 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')
这对您有帮助吗:?
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');