我想基于id或默认id加入两个表。
我有两张桌子用不同语言传播所有国家:
国家:
CREATE TABLE `country` (
`ctry_id` smallint(7) unsigned NOT NULL AUTO_INCREMENT,
`ctry_iso` varchar(2) DEFAULT NULL,
PRIMARY KEY (`ctry_id`)
);
country_lang:
CREATE TABLE `country_lang` (
`ctryl_ctry_id` smallint(7) unsigned NOT NULL,
`ctryl_lang_id` smallint(5) unsigned NOT NULL DEFAULT '1',
`ctryl_name` varchar(50) COLLATE utf32_unicode_ci NOT NULL,
PRIMARY KEY (`ctryl_ctry_id`,`ctryl_lang_id`)
) ;
$ lang_id = 129;
SELECT c.ctry_id, cl.ctryl_name,cl.ctryl_lang_id
FROM country c
LEFT JOIN country_lang cl on cl.ctryl_ctry_id = c.ctry_id AND ((cl.ctryl_lang_id= $lang_id AND cl.ctryl_lang_id) OR cl.ctryl_lang_id=1)
ORDER BY c.ctry_iso ASC
我只想通过提供的lang_id获取记录连接,如果country_lang表中找不到记录国家/地区记录,则对应lang_id,然后按id返回。
答案 0 :(得分:1)
也许以下内容更符合您的需求?
SELECT c.ctry_id, cl.ctryl_name,cl.ctryl_lang_id, c.ctry_iso,
c.ctry_iso3, c.ctry_flag, c.ctry_phone_code
FROM country c
LEFT JOIN country_lang cl on cl.ctryl_ctry_id = CASE
WHEN EXISTS(SELECT 1 FROM country_lang WHERE ctryl_ctry_id=ctry_id)
THEN ctryl_ctry_id
ELSE 1 END
ORDER BY c.ctry_iso ASC
这将按照country
- 记录完全返回一行行,并且 相应的语言ID 或默认ID { {1}}。
或者,使用1
,您也可以写
COALESCE()
(不可否认,我还没有理解,SELECT c.ctry_id, cl.ctryl_name,cl.ctryl_lang_id, c.ctry_iso,
c.ctry_iso3, c.ctry_flag, c.ctry_phone_code
FROM country c
LEFT JOIN country_lang cl on cl.ctryl_ctry_id = COALESCE(
(SELECT ctryl_ctry_id FROM country_lang WHERE ctryl_ctry_id=ctry_id),1)
ORDER BY c.ctry_iso ASC
占有什么特别重要的意义,如果出现cl.ctryl_lang_id=129
,你会想要什么样的行为。)
答案 1 :(得分:0)
你可以试试这个:
SELECT c.ctry_id, cl.ctryl_name,cl.ctryl_lang_id, c.ctry_iso, c.ctry_iso3, c.ctry_flag, c.ctry_phone_code
FROM country c
LEFT JOIN country_lang cl on cl.ctryl_ctry_id = c.ctry_id
where (cl.ctryl_lang_id=129 AND cl.ctryl_lang_id=1)
ORDER BY c.ctry_iso ASC
答案 2 :(得分:0)
这个怎么样:
选择
c.ctry_id,cl.ctryl_name,cl.ctryl_lang_id,c.ctry_iso,c.ctry_iso3,c.ctry_flag,c.ctry_phone_code
来自国家c
LEFT JOIN country_lang cl
ON cl.ctryl_ctry_id = c.ctry_id
如果(EXITS(select * from country_lang where(country_lang.ctryl_lang_id = 129)),cl.ctryl_lang_id = 129,cl.ctryl_lang_id = 1)
ORDER BY c.ctry_iso ASC
答案 3 :(得分:0)
为我工作:
ALTER Proc [dbo].[HALAQATI_ttttttttttttt]
@tf_commentparam nvarchar(100),
@tf_secsuggdate int,
@tf_testplace nvarchar(50),
@tf_time nvarchar(7),
@tf_day int,
@an_id int,
@ResponseText nvarchar(max) out,
@ResponseNum int out -- (0 = everything is ok , 1 = error or wrong data)
AS
DECLARE @startingTranCount int
SET @startingTranCount = @@TRANCOUNT
Begin
SET XACT_ABORT ON
SET NoCount ON
BEGIN TRY
IF @startingTranCount > 0
SAVE TRANSACTION mySavePointName
ELSE
BEGIN TRANSACTION
DECLARE @return_value_FIRST int,
@tf_id int,
@createddate int,
@UnitIDFromStudentID int,
@StudentIDFromAutoNominationID int
set @createddate = (select dbo.f_getHijNowByInteger());
set @StudentIDFromAutoNominationID = (select st_id from tbl_autonomination where an_id = @an_id);
set @UnitIDFromStudentID = (select sec_id from tbl_secmsq where sm_id =
(select sm_id from tbl_ring where rg_id =
(select Ring_ID from HALAQATI_VIEW_GetAllStudents where Student_ID = @StudentIDFromAutoNominationID)))
--/////////////////////////////////--
DECLARE @return_value_SECOND int,@msg nvarchar(500)
Declare @BranchNumFromAnID int = (select ne_branchno from tbl_nomineeexam where an_id = @an_id)
--/////////////////////////////////--
DECLARE @return_value_THIRD int
--/////////////////////////////////--
EXEC @return_value_FIRST = [dbo].[sp_inserttestform]
@tf_comment = @tf_commentparam,
@tf_date = @createddate,
@tf_secsuggdate = @tf_secsuggdate,
@tf_testplace = @tf_testplace,
@tf_unittype = 1, -- قطاع
@tf_unitid = @UnitIDFromStudentID,
@tf_id = @tf_id OUTPUT,
@tf_userid = 10,--رقم جلال سعيد في التعليمية,
@tf_type = 1, --آلي
@tf_time = @tf_time,
@tf_day = @tf_day,
@tf_TFtype = 1 -- أجزاء
if (@return_value_FIRST != 0 and @tf_id is null)
begin
if (@return_value_FIRST = 1)
begin
set @ResponseText = 'أقل من يوم وأكثر من 15 يوم'
set @ResponseNum = 1
return
end
else if (@return_value_FIRST = 2)
begin
set @ResponseText = 'لايوجد نقاط كافية للترشيح'
set @ResponseNum = 1
return
end
else if (@return_value_FIRST = 3)
begin
set @ResponseText = 'لم يتم ربط مركز الإشراف أو المجمع بمشرف لجان'
set @ResponseNum = 1
return
end
else
begin
set @ResponseText = 'هناك خطأ حاول في وقت لاحق'
set @ResponseNum = 1
return
end
IF @startingTranCount > 0
ROLLBACK TRANSACTION MySavePointName
ELSE
ROLLBACK
End
EXEC @return_value_SECOND = [dbo].[sp_insertAutoNominee]
@tf_id = @tf_id,
@st_id = @StudentIDFromAutoNominationID,
@an_id = @an_id,
@ne_branchno = @BranchNumFromAnID,
@ne_userid = 10,
@msg = @msg OUTPUT
if (@return_value_SECOND != 0 or @return_value_SECOND is not null)
begin
--ROLLBACK TRANSACTION
if CHARINDEX('بنفس الفرع ونتيجته ناجح',@msg) > 0
begin
set @ResponseText = 'لا يمكن إضافة ترشيح للطالب لأن له ترشيح سابق بنفس الفرع ونتيجته ناجح أو لم يختبر بعد'
set @ResponseNum = 1
return
end
if CHARINDEX('خلال السبعة أيام',@msg) > 0
begin
set @ResponseText = 'لا يمكن إضافة ترشيح للطالب لأنه غاب عن اختبار في نفس الفرع خلال السبعة أيام الماضية'
set @ResponseNum = 1
return
end
if CHARINDEX('خلال الأربعة عشر يوماً',@msg) > 0
begin
set @ResponseText = 'لا يمكن إضافة ترشيح للطالب لأنه رسب في نفس الاختبار خلال الأربعة عشر يوماً الماضية'
set @ResponseNum = 1
return
end
IF @startingTranCount > 0
ROLLBACK TRANSACTION MySavePointName
ELSE
ROLLBACK
end
EXEC @return_value_THIRD = [dbo].[sp_changeTFState]
@tf_state = 4,
@tf_id = @tf_id,
@tf_chatsys = NULL,
@tf_testdate = @tf_secsuggdate,
@tf_time = @tf_time,
@tf_day = @tf_day,
@ne_cerprintdate = NULL
IF @startingTranCount = 0
set @ResponseText = 'تم إعتماد و ترشيح الطالب إلى الإختبار بنجاح , وتم إرسال كافة البيانات إلى قسم الإختبارات في الجمعية'
set @ResponseNum = 0
COMMIT
END TRY
--BEGIN CATCH
--IF @startingTranCount > 0
-- ROLLBACK TRANSACTION MySavePointName
--ELSE
-- ROLLBACK TRANSACTION
-- set @ResponseText = ERROR_MESSAGE ()
-- set @ResponseNum = 1
--END CATCH
begin catch
declare @error int, @message varchar(4000), @xstate int;
select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
if @xstate = -1
rollback
if @xstate = 1 and @startingTranCount = 0
rollback
if @xstate = 1 and @startingTranCount > 0
rollback transaction usp_my_procedure_name;
raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
end catch
End